Сингулярная комплексная матрица равна 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 вместо реализации нестандартного решения, склонного к ошибкам.
Как вы думаете? Что было бы хорошим выбором и почему?
Позволять 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 ++ .