【发布时间】:2017-12-08 15:35:52
【问题描述】:
我目前正在尝试使用犰狳将 matlab 代码转换为 C++。我按照 aramdillo 文档将一些 matlab 代码转换为 C++。然而,与matlab相比,性能令人失望。
在 Matlab 中,逆矩阵 A 大小 (625x625) 大约需要 0.1 秒,而在 C++ 中则需要 3 多秒。
在 C++ 中我都尝试过
solve()
还有
inv()
我知道 inv 产生的结果不太准确,因此我不喜欢使用它。此外,我真的需要矩阵 A 的逆矩阵,因为我稍后在算法中使用了对角线元素。
产生这些结果的代码:
Matlab
x=A\b
invA = A\eye(size(A))
C++
arma::mat x = solve(A,b)
arma::mat invA = solve(A,eye(625,625))
我正在使用的版本:
C++:
Visual Studio 2013
犰狳 8.300.1
- 英特尔 MKL 2018.1.156
Matlab:
matlab 2016b
版本-blas
英特尔(R) 数学内核库版本 11.3.1 产品内部版本 20151021,适用于英特尔(R) 64 架构应用,CNR 分支 AVX2
- 版本-lapack
英特尔(R) 数学内核库版本 11.3.1 产品内部版本 20151021,适用于英特尔(R) 64 架构应用程序,CNR 分支 AVX2 线性代数包版本 3.5.0
有没有人知道如何使用犰狳克服 C++ 速度不足的问题?
【问题讨论】:
-
你开启优化了吗?你可以试试eigen。如果这没有帮助,您将需要更深入地研究生成的代码,看看 matlab 没有做什么。但是您可以期望像矩阵求逆这样的运算在 matlab 中得到很好的优化,所以我不期望有很大的性能改进。您也可以尝试更好的编译器。按照今天的标准,VS2013 是缺乏的。你可以试试 g++。
-
你真的需要逆吗?如果您正在求解 Ax=y,那么有比暴力求逆更快的方法,具体取决于矩阵的结构。
-
在 Visual Studio 中,确保在比较基准测试时选择了发布选项,而不是调试选项
标签: c++ matlab armadillo intel-mkl