MATLAB: запуск функции из предыдущей версии - PullRequest
4 голосов
/ 02 мая 2011

РЕДАКТИРОВАТЬ:

Спасибо @yoda и @morispaa.Вы оба правы, и решение @ morispaa работает, т.е. моя обработка преобразованных коэффициентов основана на предположениях относительно пространства, охватываемого Z , а также порядка и "Ориентация " векторов Z дает правильный результат, если я обновлю знак столбцов Q , чтобы диагональ R была положительнойэлементы.

Для получения более подробной информации о преобразовании, над которым я работаю, вы можете прочитать this ; Z ниже = выборочные полиномы Зернике, которые известны тем, что не ортогональны или полны в дискретном случае (наш случай).

Интуиция о том, почему решение, предложенное@morispaa работает.Я хотел бы услышать ваше мнение об этом:

Моя интуиция заключается в том, что каким-то образом соблюдение реальных неотрицательных диагоналей в R делает основу Q что " лучше выравнивает " с векторами в Z (что, как я уже говорил ранее, не унитарно), и, следовательно, варианты 1 и 2 ниже, даже если они представляютразличные преобразования, выходные коэффициенты, вероятно, в аналогичном пространстве.

Более конкретно, я думаю, Z"почти" унитарен, и, возможно, это приводит к разложению QR , чтобы вернутьсяоснование, которое достаточно близко к Z ?Только тогда я могу представить, что моя обработка преобразованных коэффициентов, основанная на предположениях о особенностях векторов в Z , работает, когда диагональ Q является полностью положительным, но не тогда, когда имеет отрицательные записи.Как вы думаете?

Фон

У меня на компьютере установлены оба MATLAB R2011a и R2010b .

Одно из изменений с R2010b на R2011a влияет на реализацию qr() (см. Примечания к выпуску об этом конкретном изменении здесь ).

Важная часть одного из моих проектов использует qr() для оценки ортогональной основы для прямого и обратного преобразования.Мой код применяет это преобразование к входному сигналу, обрабатывает преобразованные коэффициенты и возвращает обработанный сигнал обратно.Другими словами, изменения, сделанные в R2011a до qr(), заставили блок, который обрабатывает коэффициенты этого преобразования, перестать работать (обратное преобразование не возвращает ожидаемое обратное преобразование обработанного сигнала).

Каким-то образом матрица Q , которая теперь возвращается из qr(), отличается от старой версии тем, что мешает правильной работе преобразованных коэффициентов.

Первый вопрос

В свете вышесказанного, можно ли R2011a указать qr() из R2010b ?

Второй вопрос

Я использую Q и Q ' для вычисления прямого и обратного преобразования;Вы можете увидеть более подробную информацию здесь .Более конкретно, я использую y = Q * x и x = Q '* y для вычисления прямого и обратного преобразования соответственно.Другой способ вычисления прямого преобразования - использование метода наименьших квадратов.Другими словами, у нас есть два варианта:

Вариант 1: прямое и обратное преобразование с использованием QR-факторизации:

% Direct:
[Q R] = qr(Z);
y = Q' * x;

% Some processing of the y coefficients
% ...

% Inverse:
x = Q*y;

Вариант 2: прямое и обратное преобразованиечерез метод наименьших квадратов

% Direct:
y = Z \ x;

% Some processing of the y coefficients
% ...

% Inverse:
x = Z*y;

где наши переменные:

% x = Input vector
% y = Direct transformation of x
% Z = Matrix with sampled basis

В R2011a Опция 1 выше перестал работать (работает в R2010b ).Мне очень нравится идея использования qr() для прямого и обратного преобразования (это намного быстрее, чем вычисление наименьших квадратов для каждого нового вектора).Если я хотел использовать новый qr() для своего проекта, кто-нибудь знает, как заставить мое преобразование работать снова с новым Q ?

Ответы [ 2 ]

2 голосов
/ 03 мая 2011

Я думаю (на данный момент у вас нет MATLAB под рукой), что вы можете восстановить поведение версии 2010b следующим образом:

[Q R] = qr(Z);
D = diag(sign(diag(R)));
R2 = D*R;
Q2 = Q*D;

Теперь R2 будет верхним треугольником, имеет положительную диагональ, Q2 остается ортогональным (или унитарным) и Q2*R2 = Z. В сложном случае используйте

R2 = D'*R;
Q2 = Q*D;
2 голосов
/ 03 мая 2011

При факторизации QR как A=QR, R - верхнетреугольная матрица.Если ваша матрица A является обратимой , то факторизация будет уникальной , если вы наложите условие, что R имеет действительные неотрицательные диагонали.Если это условие ослаблено, вы получаете ортогональную матрицу Q и верхнетреугольную матрицу R, но они не обязательно должны быть уникальными.

Неединственность разложений часто смущает людей, и ядумал, что я укажу вам один из моих любимых примеров: собственные векторы единичной матрицы .

По предоставленной вами ссылке:

Вопросы совместимости: Поскольку QR-факторизация не уникальна, эти разные результаты по-прежнему верны.Убедитесь, что ваш код не зависит от значений элементов факторов Q и R.

Это то, что происходит с вашим кодом?Зависит ли это от формы Q и R?

В качестве быстрого исправления, не могли бы вы попробовать это с R2010b:

which qr.m

На моей машине я получаю /Applications/MATLAB_R2010b.app/toolbox/matlab/matfun/qr.m.Не могли бы вы скопировать эту функцию и поместить ее в R2011 путь и переименовать в qr2010 или как-то еще?Затем, когда вам понадобится старая функция, вы можете вызвать qr2010 из последней версии MATLAB, и она должна использовать старый алгоритм.Я не проверял это, поэтому дайте мне знать, если это работает.

РЕДАКТИРОВАТЬ

Я установил R2011a на свою машину и извлек qr.Как я уже сказал, невыполнение положительных диагоналей приведет к различным комбинациям для знаков элементов, что сделает решение неуникальным.Тем не менее, прямое и обратное преобразования должны работать, и это работает на моей машине.

A=magic(5);x=(1:5)';   %'
[Q R]=qr(A);
y=Q'*x;                %'
z=Q*y;

z'

ans =

    1.0000    2.0000    3.0000    4.0000    5.0000

Я получаю одинаковый результат как в R2011a, так и R2010b.Итак, я полагаю, что вы полагаетесь на положительные диагонали, что, вероятно, не очень хорошая вещь.

Но если вы хотите сохранить свой код, но вместо этого получите новый qr дляверните те же матрицы, что и в R2010b, тогда вы должны использовать предложение Мориспа.

РЕДАКТИРОВАТЬ 2

Объяснение решения Мориспа: Поскольку в 2010b, диагоналиR положительно, чтобы получить такое же поведение в 2011a, все, что вам нужно сделать, это получить знак диагоналей и распространить его по всей матрице R.В приведенном выше примере R равно

R =

  -32.4808  -26.6311  -21.3973  -23.7063  -25.8615
         0   19.8943   12.3234    1.9439    4.0856
         0         0  -24.3985  -11.6316   -3.7415
         0         0         0  -20.0982   -9.9739
         0         0         0         0  -16.0005

и D равно

D =

    -1     0     0     0     0
     0     1     0     0     0
     0     0    -1     0     0
     0     0     0    -1     0
     0     0     0     0    -1

Диагонали R автоматически становятся положительными (это так же просто, как -1*-1=1),Точно так же вы распространяете знак в матрице Q.Обратите внимание, что D*D - это просто квадрат элементов для диагональной матрицы и равен I, единичной матрице.Следовательно, мы получаем

 Q2*R2=Q*D*D*R
      =Q*I*R
      =Q*R
      =A
...