2013-04-17 3 views
2

Рассмотрим следующий пример: минимальныйMatlab Codegen Eig Function - это ошибка?

function CoderEigFail() %#codegen 
A = [0 sqrt(2); sqrt(2) 0]; 
[B C] = eig(A) 

Когда я компилирую это через codegen CoderEigFail.m и запустить его, я получаю другую матрицу B, чем я получаю, когда я бегу оригинальный Matlab файл вместо. В частности, для файла mex я получаю B = [1 1; -1 1], а для файла Matlab - B = [-0.7071 0.7071; 0,7071 0,7071]. У меня есть Matlab R2011a, работающий на MacOSx Mountain Lion.

Может ли кто-нибудь воспроизвести/объяснить это поведение? Это ошибка, или я что-то пропустил?

+5

Интересная "ошибка". Поймите, однако, что собственный вектор - это просто вектор. Таким образом, по существу, это просто направление, которое может быть произвольно масштабировано и по-прежнему действительным (в том смысле, что направление <1,2> идентично направлению <2,4> и т. Д. Собственные векторы уникальны только с коэффициентом масштабирования. По моему опыту, Matlab всегда выбирает масштаб эти собственные векторы (столбцы B), так что их 2-норма равна единице. По-видимому, скомпилированная версия либо не масштабируется, либо масштабируется по-разному. Надеюсь, кто-то еще может заполнить более подробную информацию о том, почему различия в масштабировании. – Stuart

ответ

5

Нет, это не ошибка.

Как указал Стюарт в комментарии к вопросу, собственные векторы обычно нормированы. Это указано в примечании в документации eig().

Разница в поведении со скомпилированной версией является документированной функцией в «Expected Differences in Behavior After Compiling MATLAB Code» в разделе «Для некоторых расширенных функций библиотеки».

Это поведение просто признано, но не оправдано или не объяснено.

Смежные вопросы