其他分享
首页 > 其他分享> > C中的矩阵运算(使用Blas / Lapack或其他替代方案)

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