我有一个列随机矩阵 A(n×n 实数,非负矩阵)并想在 C++ 中求解以下方程:Ax=x
我假设我需要找出一个特征向量 x,其中特征值必须为 1(对吗?),但我无法在 C++ 中找到它。到目前为止,我已经检查了一些数学库,例如 Seldon、CPPScaLapack、Eigen ......其中,Eigen 似乎是一个不错的选择,但我不明白如何利用它们中的任何一个来解决上面的方程。
你能给我一些建议/代码片段或想法来解决这个等式吗?非常感谢任何帮助。
谢谢。
我有一个列随机矩阵 A(n×n 实数,非负矩阵)并想在 C++ 中求解以下方程:Ax=x
我假设我需要找出一个特征向量 x,其中特征值必须为 1(对吗?),但我无法在 C++ 中找到它。到目前为止,我已经检查了一些数学库,例如 Seldon、CPPScaLapack、Eigen ......其中,Eigen 似乎是一个不错的选择,但我不明白如何利用它们中的任何一个来解决上面的方程。
你能给我一些建议/代码片段或想法来解决这个等式吗?非常感谢任何帮助。
谢谢。
另一种方法是计算矩阵的内核减去单位矩阵。这可能会或可能不会比使用 Carl 解释的幂迭代更快,具体取决于矩阵的大小和其他特征值。当矩阵变大并且第二个特征值远离 1 时,幂迭代会更好。
想法是将 Ax = x 重写为 Ax - x = 0。然后使用 Ix = x,其中 I 表示单位矩阵。因此,Ax - x = 0 等价于 Ax - Ix = 0 或 (AI) x = 0。因此,您的特征向量 x 位于 AI 的内核(或零空间)中。
本教程页面解释了如何使用 Eigen 计算矩阵的内核。一些未经测试的代码:
MatrixXf M;
/* initialize M */
FullPivLU<MatrixXf> lu_decomp(M);
VectorXf x = lu_decomp.kernel().col(0);
/* x now contains the vector you want */
你可能会发现内核是空的。这意味着矩阵不是真正随机的,或者您需要调整阈值(请参阅上面链接的页面)。
由于随机矩阵 $M$ 的最大特征向量是统一的,你可以通过迭代找到这个特征向量(除非你真的不擅长猜测初始值)。
从一些随机选择的初始向量 $v_1$ 开始,其值(概率)总和为 1。将 $M$ 应用于 $v_1$ 以得到 $Mv_1$。现在重新归一化这个新向量$Mv_1$,即除以其元素之和得到$v_2$。这是一个新的概率向量,它将更接近所需的特征向量(除非您最初的猜测恰好与特征向量正交)。
重复这个过程直到$v_k$ 接近稳定。根据需要,这应该是一个具有 $Mv_k = v_k$ 的向量。