Псевдообратная (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 вместо реализации нестандартного решения, склонного к ошибкам.

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

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. Эти функции обернуты библиотеками Armadillo и Eigen для C++.

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

Другие вопросы по тегам