MATLAB: запуск функции из предыдущей версии

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

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

Для получения более подробной информации о преобразовании, над которым я работаю, вы можете прочитать это ; 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?


person Amelio Vazquez-Reina    schedule 02.05.2011    source источник
comment
Чем отличается вывод нового qr()? Он полностью сломан? Или это просто крошечные числовые несоответствия, которые можно отнести к стандартным проблемам с плавающей запятой? Это последнее, если все ваше приложение ломается, это, вероятно, признак того, что ваш алгоритм не является численно стабильным. (Я понимаю, что это не очень полезный ответ на ваш вопрос...)   -  person Oliver Charlesworth    schedule 02.05.2011
comment
Спасибо @Oli. Я совершенно уверен, что это не проблема численной стабильности, а скорее проблема, связанная с различиями между матрицами Q, возвращаемыми новой и старой версией (я думаю, что факторизация QR не уникальна). Новая qr(), вероятно, верна, но новая факторизация не удовлетворяет тем же свойствам, что и старая. Я думаю, проблема связана с неотрицательностью диагонали матрицы R, свойством, которое гарантировалось в предыдущей версии, но не в новой, и которое каким-то образом влияет на матрицу Q тоже.   -  person Amelio Vazquez-Reina    schedule 02.05.2011


Ответы (2)


В 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, вам следует воспользоваться предложением morispaa.

ИЗМЕНИТЬ 2

Объяснение решения morispaa: поскольку в 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
person abcd    schedule 03.05.2011
comment
Спасибо @yoda, вы правы. Это очень полезно, и решение @morispaa работает, хотя я не знаю, почему. Я обновил вопрос, чтобы отразить все это! - person Amelio Vazquez-Reina; 04.05.2011
comment
Спасибо @yoda, если не слишком много, мне было бы любопытно узнать, что вы думаете об интуиции, которую я дал в разделе EDIT моего поста о том, почему обработка преобразованных коэффициентов работает, когда D работает только с положительными элементами, но нет, если он содержит отрицательные значения. - person Amelio Vazquez-Reina; 04.05.2011
comment
@AmV: я тоже ничего не знаю о полиномах Зернике. Однако я не думаю, что это имеет какое-либо отношение к диагоналям Q. Вы обнаружите, что его диагонали могут иметь отрицательные значения (возможно, не для вашего примера) даже в R2010b. Ограничение действует только по диагоналям R, а не Q. - person abcd; 05.05.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;
person morispaa    schedule 03.05.2011
comment
Спасибо @morispaa. Это очень полезно и отвечает на мой второй вопрос! Я до сих пор не понимаю, почему, я обновил вопрос в разделе EDIT вверху, чтобы отразить это. - person Amelio Vazquez-Reina; 04.05.2011
comment
Я абсолютно ничего не знаю о полиномах Цернике, но может ли быть так, что использование разложения QR, которое не вызывает неотрицательную диагональ в R, каким-то образом искажает хиральность ортогонального базиса, который охватывают векторы-строки Q? Просто предположение... - person morispaa; 04.05.2011