如何在 C++ 中快速对角化矩阵?

Posted

技术标签:

【中文标题】如何在 C++ 中快速对角化矩阵?【英文标题】:How do I diagonalize a matrix quickly in C++? 【发布时间】:2013-10-25 20:54:30 【问题描述】:

我不知道选择哪个库(对于 Windows):LAPACK++、Armadillo、IT++、Eigen 还是其他?

我需要做的就是检查一个大(大约 10,000*10,000)矩阵是否可对角化,如果是,则得到对角矩阵和可逆矩阵,使得 D=(P^(-1))*A *P。这必须尽快完成。我不知道要使用哪个库。

另外,我很高兴了解这些库的优缺点。

【问题讨论】:

我不认为它更快,而且我在 c++ 中有一个完整的程序,所以它不会那么方便。它更快吗?谢谢! MatLab 是用 C++ 编写的,我很确定开发它的人尽了最大努力让它变得更快。此外,它们可能为此具有特殊的内置函数,因此脚本可能只需要几行代码。谷歌一下,有很多相关信息。 好的,谢谢!我只是认为它会更慢,因为没有编译器。你知道如何在 C++ 中使用 matlab 吗? 没有线索。但是为什么在 C++ 中使用它呢?它也有自己的编译器。 什么意思?我已经用 C++ 编写了大部分程序。顺便说一句,由于编译器的原因,它在 C++ 中更快(我一开始尝试在 matlab 中编写它,但花了更长的时间)。 【参考方案1】:

这可能是一个相当模糊的答案,因为我不知道您遇到的确切问题是什么,但通常情况下您实际上并不需要所有这些信息,即您只关心一个矩阵的最大能量特征值;至于其余的 - 如果您将 0.001 作为特征值(可对角矩阵)或 0.000(不可对角矩阵),这真的很重要吗?对于许多现实世界(甚至理论)的应用,答案是“不是真的”。

所以,我的建议是您通过放弃您正在寻找的信息的准确性粒度来获得速度

【讨论】:

【参考方案2】:

您可能想对此持保留态度,但here 是 Eigen 开发人员发布的一些基准。除了 Eigen,我从未使用过任何其他线性代数库,但您的需求可能与我的不同。

【讨论】:

【参考方案3】:

就找到行列式而言,您可以使用许多不同的实现。一种是使用高斯消元法来创建一个上/下三角矩阵 - 这是有益的,因为您只需在对角线上乘以得到行列式。如果任何行或任何列最终归零,则行列式将为 0,并且矩阵不会有逆矩阵。实际上,您可以使用这种方法并使用单位矩阵来扩充矩阵并执行完整的 Gauss-Jordan 消除并将原始矩阵转换为单位矩阵,如 http://www.mathportal.org/linear-algebra/matrices/gauss-jordan.php 所示。

【讨论】:

谢谢,但我不明白这如何回答我的问题,请澄清。

以上是关于如何在 C++ 中快速对角化矩阵?的主要内容,如果未能解决你的问题,请参考以下文章

李宏毅线性代数笔记9:对角化

用for循环在C++中打印矩阵二次对角线?

怎么判断矩阵中的方阵可以对角化

如何获得三对角Toeplitz矩阵的实特征值和特征向量?

如何在对角线中遍历矩阵并返回每个位置的索引?

矩阵如何求幂?