C中的矩阵运算(使用Blas / Lapack或其他替代方案)
作者:互联网
我是C的新手,我正在尝试学习如何在C中进行矩阵运算.
我读过Blas / Lapack是最好的方法(见http://cpplapack.sourceforge.net/).
但是,我发现很难开始使用它.
任何人都可以给我一些示例代码,说明如何使用C中的Blas / Lapack进行矩阵乘法,反转等简单矩阵运算.
如果使用其他替代方法更容易,那么我也很想看到一些示例代码.
提前致谢.
解决方法:
我假设,如果你是C的新手,你也是C和Fortran的新手.在那种情况下,我肯定会建议你,不要从Blas / Lapack开始,至少不是没有一个好的C -wrapper.
我的建议是看看Eigen,它使用本机C代码提供了更容易的矩阵操作开始.你可以看看他们的Tutorial开始吧.据说Eigen性能与Blas / Lapack相当,例如their benchmark.但是我没有亲自测试.
如果你真的想要降低水平并使用Blas / Lapack来看看cBlas(Blas的C-Wrapper)和Lapack的可用功能.另外你可以找到一些如何使用Lapacke(C-Wrapper of Lapack)的例子. )here.但是不要指望事情很好并且记录良好!
最后给出你的问题的答案:这是我前一段时间用于基准测试的代码剪辑.代码创建两个随机矩阵A和B,并将它们乘以矩阵C.
#include <random>
#include <cblas.h>
int main ( int argc, char* argv[] ) {
//Random numbers
std::mt19937_64 rnd;
std::uniform_real_distribution<double> doubleDist(0, 1);
//Create Arrays that represent the matrices A,B,C
const int n = 20;
double* A = new double[n*n];
double* B = new double[n*n];
double* C = new double[n*n];
//Fill A and B with random numbers
for(uint i =0; i <n; i++){
for(uint j=0; j<n; j++){
A[i*n+j] = doubleDist(rnd);
B[i*n+j] = doubleDist(rnd);
}
}
//Calculate A*B=C
cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, n, n, n, 1.0, A, n, B, n, 0.0, C, n);
//Clean up
delete[] A;
delete[] B;
delete[] C;
return 0;
}
希望这可以帮助.
标签:c,lapack,blas 来源: https://codeday.me/bug/20190830/1771121.html