2009-08-20 2 views
0

Прежде всего, название очень плохое из-за моего недостатка в сжатой лексике. Я попытаюсь описать, что я делаю, а затем снова задаю свой вопрос.Алгоритм, который принимает 2 'подобные' матрицы и 'выравнивает' друг другу

Справочная информация

Скажем, у меня есть 2 матрицы размером n х m, где n является число экспериментальных векторов наблюдений, длина каждой из m (временных рядов, по которой были собраны наблюдения). Одной из этих матриц является исходная матрица, называемая S, другая - реконструированная версия S, называемая Y.


Давайте предположим, что Y правильно реконструирует S. Однако из-за ограничений алгоритма реконструкции Y не может определить истинную амплитуду векторов в S, и не гарантирует, что он обеспечит правильный знак для этих векторов (векторы могут быть перевернуты). Кроме того, порядок векторов наблюдений в Y может не соответствовать первоначальному порядку соответствующих векторов в S.

Мой вопрос

Есть ли алгоритм или метод для создания новой матрицы, которая является «Перестройка» в Y к S, так что, когда Y и S нормированы, алгоритм может (1) найти векторы в Y, которые соответствуют векторам в S и восстановить исходный порядок векторов, и (2) также соответствуют признакам векторов?


Как всегда, я действительно ценю всю предоставленную помощь. Благодаря!

+0

Это домашнее задание? Потому что я не могу себе представить, что кому-то это понадобится в реальной жизни, и DONT знает, как его решить ... – zvolkov

+0

zvolkov: нет, это не домашнее задание ...и я уже думал о методе, предоставленном Yuval A, но возможно, что у меня может быть очень большой набор данных, и поэтому я хочу избежать квадратичных методов времени, если это возможно, - мне было интересно, было ли что-то быстрее. Что касается меня, не зная, как это сделать ... ну, вот почему я спрашиваю. – oort

+0

Нет информации о ограничениях на переносимость векторов, и я полагаю, что вы застряли в процессе Юваля. Если вы предоставили алгоритм реконструкции, может быть какое-то свойство, которое может быть использовано для ускорения работы. –

ответ

2

Как насчет простого вычисления нормированной формы для каждого вектора в обеих матрицах и сравнения? Это должно дать вам точное взаимно однозначное соответствие для каждого вектора в каждой матрице.

Нормальная форма вектора является тот, который соответствует:

v_norm = v/||v|| 

, где ||v|| является евклидова норма для вектора. Для v=(v1, v2, ..., vn) у нас есть ||v|| = sqrt(v1^2 + ... + vn^2).

Оттуда вы можете восстановить порядок и вернуть каждому вектору его первоначальную длину и направление (вектор или его противоположность).

Алгоритм должен быть довольно простым отсюда, просто решите свою реализацию. Этот метод должен иметь квадратичную сложность . В комментарии вы можете достичь сложности O(nlogn) по этому алгоритму. Если вам нужно что-то лучше этого, линейная сложность - в частности, вам понадобится гораздо более сложный алгоритм, о котором я не могу сейчас думать.

+0

Почему это квадратично? Сортируйте каждый вектор Y и S (наряду с номерами строк до сортировки), а затем их легко сопоставить по строкам. Вы также должны нормализовать знак, например, заставляя первый ненулевой элемент каждого вектора быть положительным. Тогда это все n log n. – xan