2

奇异复数矩阵为 2 n x 2 n,其中 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,而不是实施自定义容易出错的解决方案。

你怎么看?哪个是一个不错的选择,为什么?

4

1 回答 1

2

A是一个矩阵A*及其共轭转置。那么矩阵A.A*就是 Hermitian。它甚至是正半定的https://en.wikipedia.org/wiki/Conjugate_transpose

在这种情况下,SVD 和特征值分解之间没有根本区别。http://cims.nyu.edu/~donev/Teaching/NMI-Fall2010/Lecture5.handout.pdf

因此,可以证明有用的 Lapack 例程是zheevd()zheev()

由于Lapacke接口,您可以为 C 调用这些函数。这些函数由用于 C++的ArmadilloEigen库包装。

看看我的这个答案,了解如何使用 Lapacke 调用这些函数的示例:low RAM sumption c++ eigen solver

于 2015-09-21T19:36:39.677 回答