Псевдообратная (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.