我是C++
的新手,我正在尝试学习如何在C++
中进行矩阵运算。
我已经读过Blas
/ Lapack
是最好的方法(参见http://cpplapack.sourceforge.net/)。
但是,我发现很难开始使用它。
有人可以在Blas
中使用Lapack
/ C++
向我提供一些示例代码,说明如何使用矩阵乘法,反转等简单矩阵运算。
如果使用其他替代方法更容易,那么我也很想看到一些示例代码。
提前致谢。
答案 0 :(得分:5)
我认为,如果您不熟悉C++
,则您也是C
和Fortran
的新手。在那种情况下,我肯定会建议你,不要先从Blas / Lapack开始,至少不要没有漂亮的C++
- 包装器。
我的建议是查看Eigen,它可以使用原生C++
代码更轻松地开始矩阵运算。您可以查看他们的Tutorial即可开始使用。据说Eigen性能与Blas / Lapack相当,例如their benchmark。但是我自己没有测试过。
如果你真的想要进入低级并使用Blas
/ Lapack
查看cBlas(C
- Blas包装)的可用功能, Lapack。另外,您可以找到一些如何使用Lapacke(C
- Lapack of Wackper)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;
}
希望这有帮助。