Псевдообратная (SVD) сингулярная комплексная квадратная матрица в C/C++

Сингулярная комплексная матрица равна 2n x 2n, где n равно 3; 4 или 5. Как рассчитать разложение по сингулярным значениям в C/C++?

Входная матрица R имеет вид Y*Y', где ()' трансъюгирует.

Собственные векторы в U являются основным выходом. Рассмотрим следующий код Matlab:

[U,D,V]=svd(R);
En=U(:,n+1:m); % first few eigenvectors out
EnEn = En*En';

Большинство библиотек C/C++ (например, OpenCV) поддерживают инверсию матриц и SVD только для реальных матриц. В неособом случае

R = Re(R) + j*Im(R)

разрешение помогает. Верхняя половина перевернутой

[Re(R) -Im(R);
Im(R) Re(R)]

дает R-1, когда он сложный. Поскольку численный метод здесь является ключевым, многие предлагали Armadillo и Eigen вместо реализации собственного решения, подверженного ошибкам.

Как вы думаете? Что было бы хорошим выбором и почему?


person renonsz    schedule 21.09.2015    source источник
comment
в C/C++ Такого языка не существует. Выбери один.   -  person πάντα ῥεῖ    schedule 21.09.2015
comment
Это тебе решать. Это алгоритм, а не шаблон проектирования.   -  person renonsz    schedule 21.09.2015
comment
Используйте LAPACK: netlib.org/lapack/lug/node32.html   -  person marc    schedule 21.09.2015
comment
Пришлось реализовать SVD на C (а затем скомпилировать в приложение Visual C++), используя программу Fortran в качестве эталонного алгоритма, это выполнимо (но это было 15 лет назад, поэтому я не помню, чтобы много чего можно было предложить). Но вы могли бы хотите посмотреть stackoverflow.com/questions/15697663/ (и я бы предложил взять набор тестовых матриц и сравнить то, что вы получаете в Matlab, с любым решением, которое вы используете)   -  person Foon    schedule 21.09.2015
comment
Затем @renonsz замените теги C и C++ на тег algorithm.   -  person crashmstr    schedule 21.09.2015
comment
используйте arma.sourceforge.net/docs.html#svd . есть опорная комплексная матрица   -  person    schedule 21.09.2015
comment
Я голосую за то, чтобы закрыть этот вопрос как не по теме, потому что он касается численных методов, а не программирования.   -  person Kuba hasn't forgotten Monica    schedule 21.09.2015
comment
@crashmstr Нет, мне не помогает, когда ты даешь мне e. грамм. Октавный код. Платформа — C++, но C также приветствуется, его можно безболезненно интегрировать.   -  person renonsz    schedule 21.09.2015
comment
@KubaOber Понятно. А реализация численных методов — это не программирование?   -  person renonsz    schedule 21.09.2015
comment
@marc Спасибо, я проверю.   -  person renonsz    schedule 21.09.2015
comment
@renonsz и в зависимости от платформы C может не работать в компиляторе C++, поскольку оба стандарта изменились и C != C++   -  person crashmstr    schedule 21.09.2015
comment
@crashmstr Да, и с этой логикой C!=C и C++!=C++ из-за стандартов..   -  person renonsz    schedule 12.10.2015


Ответы (1)


Пусть A будет матрицей, а A* ее сопряженным транспонированием. Тогда матрица A.A* эрмитова. Это даже положительно полуопределенное https://en.wikipedia.org/wiki/Conjugate_transpose

В этом случае принципиальной разницы между СВД и разложением по собственным значениям нет. http://cims.nyu.edu/~donev/Teaching/NMI-Fall2010/Lecture5.handout.pdf

Следовательно, подпрограммы Lapack, которые могут оказаться полезными, это zheevd() и zheev().

Вы можете вызывать эти функции для C благодаря интерфейсу Lapacke. Эти функции включены в библиотеки Armadillo и Eigen для C++.

Взгляните на этот мой ответ для примера того, как вызывать эти функции с помощью Lapacke: #32280875">малый объем оперативной памяти, потребляющий собственный решатель C++ .

person francis    schedule 21.09.2015