【问题标题】:Slow matrix inversion in C++C ++中的慢矩阵求逆
【发布时间】: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


【解决方案1】:

您是否尝试过:添加到您的代码中#ARMA_USE_LAPACK?这允许您的代码使用更优化的 .inv() 函数版本。另请查看文档:http://arma.sourceforge.net/docs.html

【讨论】:

    猜你喜欢
    • 2020-05-11
    • 2016-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-05
    • 2011-08-30
    相关资源
    最近更新 更多