C++中的矩阵运算(使用Blas/Lapack或其他替代方法)

dre*_*mer 3 c++ blas lapack

我是新手__CODE__,我正在努力学习如何进行矩阵运算__CODE__.

我已经读过__CODE__/ __CODE__是最好的方法(参见http://cpplapack.sourceforge.net/).但是,我发现很难开始使用它.

有谁能给我一些示例代码,说明如何使用__CODE__/ __CODE__in 进行简单的矩阵运算,如矩阵乘法,求逆等__CODE__.

如果使用其他替代方法更容易,那么我也很想看到一些示例代码.

提前致谢.

Haa*_*hii 6

我认为,如果你是新的C,你也是新来CA.在那种情况下,我肯定会建议你,不要从Blas/Lapack开始,至少不是没有一个好的B包装器.

我的建议是看看Eigen,它可以更容易地使用本机C代码开始矩阵运算.您可以查看他们的入门指南.据说Eigen的性能与Blas/Lapack相当,例如他们的基准.但是我没有自己测试.

如果你真的想降低水平并使用C/ C看看cBlas(ABlas 的包装)和Lapack的可用功能.另外,你可以找到一些例子来说明如何使用Lapacke(该BLAPACK的-wrapper)这里.但是不要指望事情很好并且记录良好!

最后给出你的问题的答案:这是我前一段时间用于基准测试的代码剪辑.代码创建两个随机矩阵C,C并将它们乘以矩阵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;
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.