Псевдообратная (SVD) особой комплексной квадратной матрицы в C / Stack Overflow

Сингулярная комплексная матрица равна 2N х 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 вместо реализации нестандартного решения, склонного к ошибкам.

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

1

Решение

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

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

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

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

Взгляните на мой ответ для примера того, как вызывать эти функции с помощью Lapacke: низкое потребление ОЗУ c ++ .

1

Другие решения


По вопросам рекламы [email protected]