我有一个方阵S(160 x 160)和一个巨大的矩阵X(160 x 250000).两者都是密集的numpy数组.
我的目标:找到Q,使Q = inv(chol(S))*X,其中chol(S)是S的较低的cholesky分解.
当然,一个简单的解决方案是
cholS = scipy.linalg.cholesky( S, lower=True)
scipy.linalg.solve( cholS, X )
Run Code Online (Sandbox Code Playgroud)
我的问题:这个解决方案是明显较慢(> 2倍)的蟒蛇比当我尝试在Matlab相同.以下是一些计时实验:
timeit np.linalg.solve( cholS, X)
1 loops, best of 3: 1.63 s per loop
timeit scipy.linalg.solve_triangular( cholS, X, lower=True)
1 loops, best of 3: 2.19 s per loop
timeit scipy.linalg.solve( cholS, X)
1 loops, best of 3: 2.81 s per loop
[matlab]
cholS \ X
0.675 s
[matlab using only one thread via -singleCompThread]
cholS \ X
1.26 s …Run Code Online (Sandbox Code Playgroud) 我正在使用Eigen库研究两个大矩阵的简单乘法.对于相同大小的矩阵,此乘法似乎明显慢于Matlab和Python.
有没有什么可以使特征操作更快?
问题细节
X:随机1000 x 50000矩阵
Y:随机50000 x 300矩阵
计时实验(在我2011年末的Macbook Pro上)
使用Matlab:X*Y需要~1.3秒
使用Enthought Python:numpy.dot(X,Y)需要大约2.2秒
使用特征:X*Y需要~2.7秒
特征细节
你可以得到我的Eigen代码(作为MEX函数):https://gist.github.com/michaelchughes/4742878
该MEX函数从Matlab读入两个矩阵,并返回其产品.
在没有矩阵乘积运算的情况下运行这个MEX函数(即只是执行IO)会产生可忽略的开销,因此函数和Matlab之间的IO并不能解释性能上的巨大差异.这显然是实际的矩阵产品操作.
我用g ++编译,带有这些优化标志:" - O3 -DNDEBUG"
我正在使用最新的稳定Eigen头文件(3.1.2).
关于如何提高Eigen性能的任何建议?任何人都可以复制我看到的差距吗?
更新 编译器似乎真的很重要.最初的Eigen时序是使用Apple XCode的g ++版本完成的:llvm-g ++ - 4.2.
当我使用通过MacPorts下载的g ++ - 4.7(相同的CXXOPTIMFLAGS)时,我获得2.4秒而不是2.7秒.
关于如何更好地编译的任何其他建议将非常感激.
您还可以获得此实验的原始C++代码:https://gist.github.com/michaelchughes/4747789
./MatProdEigen 1000 50000 300
在g ++ - 4.7下报告2.4秒