我尝试过这两种选择
objective = lambda A, x : (np.dot(x.T ,np.dot(A, x)))[0,0]
objective = lambda A, x : (np.matrix(x).T * np.matrix(A) * np.matrix(x))[0,0]
使用主要算法,我的算法运行时间为5秒 继续我有14秒
使用MATLAB我得到2秒
我想和Numpy一起去,但显然我需要一种方法来改善这种糟糕的结果。如何获得更快的二次型矩阵,矢量积?
注意:我描述了代码,这个lambda函数可以让所有人都知道。 改进:我只是删除scipy和numpy的原生Ubuntu软件包,然后安装以下内容
sudo pip install numpy
sudo apt-get install libatlas-base-dev gfortran
sudo pip install scipy
sudo apt-get install libpng-dev libfreetype6-dev
sudo pip install matplotlib
我提高了性能,但仍低于Matlab
答案 0 :(得分:5)
我安装了NumPy和Matlab,对于10000x10000矩阵,它们都需要45毫秒左右。
考虑到您的时间安排,我怀疑x
不是单列向量。
如果你想同时对多个列向量进行计算,请查看我对这个问题的答案:
Calculate "v^T A v" for a matrix of vectors v。
如果x
只是一个列向量(在NumPy或Matlab中),那么列出的时间非常慢。
如果您知道NumPy的安装已经与MKL链接,您可以尝试设置MKL_NUM_THREADS环境变量以匹配系统上的处理器数量。
获取正确编译的NumPy版本的一种简单方法是使用预构建的分发。 Anaconda和Enthought非常好,但他们需要订阅以获得优化版本。 学术许可证免费提供。 您还可以在此处查看:http://www.lfd.uci.edu/~gohlke/pythonlibs/
答案 1 :(得分:2)
最后,我所做的是为线性代数函数更改numpy的有界库。它使用ATLAS作为默认值,但我更加努力(比如4小时)将其更改为OpenBlas。我找到了导游Compiling numpy with OpenBLAS integration并一点一点地跟着。结果是更快的时间。它仍然缺乏Matlab(英特尔MLK)2.5秒,但可以忍受3秒执行。