C ++中的慢矩阵求逆

时间:2017-12-08 15:35:53

标签: c++ matlab armadillo intel-mkl

我目前正在尝试使用armadillo将matlab代码转换为C ++。我通过遵循aramdillo文档到C ++来转换了一些matlab代码。然而,与matlab相比,性能令人失望。

在Matlab中,大小(625x625)的矩阵A反转大约需要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

  • Armadillo 8.300.1

  • 英特尔MKL 2018.1.156

Matlab的:

  • matlab 2016b

  • version -blas

针对英特尔(R)64架构应用的英特尔(R)数学核心库版本11.3.1产品构建20151021,CNR分支AVX2

  • version -lapack

英特尔(R)数学核心库版本11.3.1产品构建20151021,用于英特尔(R)64架构应用程序,CNR分支AVX2 线性代数PACKage版本3.5.0

有没有人知道如何使用armadillo克服C ++中的这种速度不足?

1 个答案:

答案 0 :(得分:0)

您是否尝试过:添加到您的代码#ARMA_USE_LAPACK?这允许您的代码使用更优化的.inv()函数版本。另请查看文档:{​​{3}}