我不明白BLAS,LAPACK和ATLAS是如何相关的以及我应该如何一起使用它们!我一直在查看他们的所有手册,我对BLAS和LAPACK以及如何在我找到的极少数示例中使用它们有了一般概念,但我找不到任何使用ATLAS的实际示例来查看它与这两个.
我正在尝试对矩阵做一些低级别的工作,我的主要语言是C.首先我想使用GSL,但它说如果你想要最好的性能,你应该使用BLAS和ATLAS.有没有什么好的网页提供一些很好的例子,说明如何一起使用这些(在C中)?换句话说,我正在寻找使用这三个(或其中任何一个子集!)的教程.总之我很困惑!
我正在建立我的numpy/scipy环境基于blas和lapack或多或少基于这个步骤.
当我完成后,如何检查,我的numpy/scipy函数是否确实使用了之前构建的blas/lapack功能?
几天以来,我在使用MATLAB时不断收到同样的错误dlopen.我对MATLAB很新,这就是为什么我不知道该怎么做.谷歌似乎也没有帮助我.当我尝试制作一个特征向量时,我得到了这个:
Error using eig
LAPACK loading error:
dlopen: cannot load any more object with static TLS
Run Code Online (Sandbox Code Playgroud)
在进行乘法时我也得到了这个:
Error using *
BLAS loading error:
dlopen: cannot load any more object with static TLS
Run Code Online (Sandbox Code Playgroud)
我当然找到了这个问题的解决方案,但我不太懂,也不知道该怎么办.这些是我找到的主题:
有谁可以帮助我吗?
>> randn(3,3)
ans =
2.7694 0.7254 -0.2050
-1.3499 -0.0631 -0.1241
3.0349 0.7147 1.4897
>> eig(ans)
Error using eig
LAPACK loading error:
dlopen: cannot load any more object with static TLS
Run Code Online (Sandbox Code Playgroud) 我正在编写一个包含Cython扩展和使用LAPACK(和BLAS)的Python模块.我打开使用两种clapack或lapacke,或某种f2c或f2py解决方案,如果必要的.最重要的是,我能够调用lapack并blas从用Cython在紧密循环不Python的调用开销例程.
我在这里找到了一个例子.但是,该示例取决于SAGE.我希望我的模块可以在不安装SAGE的情况下进行安装,因为我的用户不太可能想要或不需要SAGE.我的用户很可能安装了numpy,scipy,pandas和scikit的软件包,所以这些都是合理的依赖.使用的接口的最佳组合是什么,以及最小的setup.py文件看起来可以获取必要的信息(来自numpy,scipy等)以进行编译?
编辑: 这是我最终做的.它适用于我的macbook,但我不知道它是多么便携.当然有更好的方法.
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
import numpy
from Cython.Build import cythonize
from numpy.distutils.system_info import get_info
# TODO: This cannot be the right way
blas_include = get_info('blas_opt')['extra_compile_args'][1][2:]
includes = [blas_include,numpy.get_include()]
setup(
cmdclass = {'build_ext': build_ext},
ext_modules = cythonize([Extension("cylapack", ["cylapack.pyx"],
include_dirs = includes,
libraries=['blas','lapack'])
])
)
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为在我的macbook上,clapack.h头文件与...相同cblas.h.然后我可以在我的pyx文件中执行此操作:
ctypedef np.int32_t …Run Code Online (Sandbox Code Playgroud) 运行Ubuntu 11.10 + python2.7 ...从源代码构建numpy并安装它,但是当我去安装它时,我得到了
ImportError: /usr/lib/liblapack.so.3gf: undefined symbol: ATL_chemv
Run Code Online (Sandbox Code Playgroud)
当它试图从numpy.linalg导入lapack_lite时.我试图从头开始重建lapack,但它似乎只是制造
/usr/local/lib/libblas.a
/usr/local/lib/liblapack.a
/usr/local/lib/libtmglib.a
Run Code Online (Sandbox Code Playgroud)
和.so文件..so.3gf来自哪里,我该如何解决?
假设我有一个double的std :: vector,即
std::vector<double> MyVec(N);
Run Code Online (Sandbox Code Playgroud)
在哪里N这么大,性能很重要.现在假设这MyVec是一个非平凡的向量(即它不是一个零向量,但已被某些例程修改).现在,我需要向量的否定版本:我需要-MyVec.
到目前为止,我一直在实施它
std::transform(MyVec.cbegin(),MyVec.cend(),MyVec.begin(),std::negate<double>());
Run Code Online (Sandbox Code Playgroud)
但是,实际上,我不知道这是否合情合理,或者只是我身边的超级天真.
我做得对吗?或者std :: transform在这种情况下只是一个超级慢的例程?
PS:我一直在使用BLAS和LAPACK库,但是我没有发现任何符合这种特殊需求的东西.但是,如果BLAS/LAPACK中存在比std :: transform更快的函数,我很高兴知道.
我正在寻找一种从python访问matlab模块的方法.我目前的情况是这样的:
ctypes并作为指向Lapack例程的指针传递.我现在的问题是:
什么是保持python中所有主要工作的有效方法,同时利用matlab/octave模块提供的可能性.如果我的ctype数组不必转换为其他对象以便运行八度音程,那么它也会很好.但是,我可以看到最后一点很难实现.
我目前的研究向我展示了两种可能的选择
我希望能够NxN使用lapack 计算C/C++中一般矩阵的逆矩阵.
我的理解是在lapack中进行反转的方法是使用dgetri函数,但是,我无法弄清楚它的所有参数应该是什么.
这是我的代码:
void dgetri_(int* N, double* A, int* lda, int* IPIV, double* WORK, int* lwork, int* INFO);
int main(){
double M [9] = {
1,2,3,
4,5,6,
7,8,9
};
return 0;
}
Run Code Online (Sandbox Code Playgroud)
你将如何完成它以3x3使用dgetri_ 获得矩阵M 的逆?
R有一个qr()函数,它使用LINPACK或LAPACK执行QR分解(根据我的经验,后者的速度提高了5%).返回的主要对象是包含在上三角矩阵R(即R=qr[upper.tri(qr)])中的矩阵"qr" .到现在为止还挺好.qr的下三角部分包含Q"紧凑形式".一个可以通过使用提取QR分解Q qr.Q().我想找到倒数qr.Q().换句话说,我确实有Q和R,并希望将它们放在"qr"对象中.R是微不足道的,但Q不是.目标是应用它qr.solve(),这比solve()在大型系统上快得多.
我是LAPACK和C++/Fortran接口的初学者.我需要在Mac OS-X Lion上使用LAPACK/BLAS解决线性方程和特征值问题.OS-X Lion提供优化的BLAS和LAPACK库(在/ usr/lib中),我链接这些库而不是从netlib下载它们.
我的程序(下面转载)正在编译并运行正常,但它给了我错误的答案.我已经在Web和Stackoverflow上进行了研究,这个问题可能要处理C++和Fortran如何以不同的格式存储数组(行主要与列主要).但是,正如您将在我的示例中看到的那样,我的示例的简单数组在C++和fortran中应该看起来相同.无论如何这里去了.
让我们说我们要解决以下线性系统:
x + y = 2
x - y = 0
解是(x,y)=(1,1).现在我尝试使用Lapack解决这个问题,如下所示
// LAPACK test code
#include<iostream>
#include<vector>
using namespace std;
extern "C" void dgetrs(char *TRANS, int *N, int *NRHS, double *A,
int *LDA, int *IPIV, double *B, int *LDB, int *INFO );
int main()
{
char trans = 'N';
int dim = 2;
int nrhs = 1;
int LDA = dim;
int LDB = dim;
int info;
vector<double> a, b;
a.push_back(1);
a.push_back(1);
a.push_back(1); …Run Code Online (Sandbox Code Playgroud)