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

时间:2014-04-27 14:15:01

标签: c++ lapack blas

我是C++的新手,我正在尝试学习如何在C++中进行矩阵运算。

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

有人可以在Blas中使用Lapack / C++向我提供一些示例代码,说明如何使用矩阵乘法,反转等简单矩阵运算。

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

提前致谢。

1 个答案:

答案 0 :(得分:5)

我认为,如果您不熟悉C++,则您也是CFortran的新手。在那种情况下,我肯定会建议你,不要先从Blas / Lapack开始,至少不要没有漂亮的C++ - 包装器。

我的建议是查看Eigen,它可以使用原生C++代码更轻松地开始矩阵运算。您可以查看他们的Tutorial即可开始使用。据说Eigen性能与Blas / Lapack相当,例如their benchmark。但是我自己没有测试过。

如果你真的想要进入低级并使用Blas / Lapack查看cBlasC - Blas包装)的可用功能, Lapack。另外,您可以找到一些如何使用Lapacke(C - Lapack of Wackper)here的示例。但是不要指望事情很好并且记录良好!

最后回答你的问题:这是我前一段时间用于基准测试的代码剪辑。代码创建两个随机矩阵AB,并将它们乘以矩阵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;
}

希望这有帮助。