0

我在运行 openblas cblas 测试程序时遇到问题。我的 Cblas 在乘方矩阵时运行完美,但是当我尝试使用非方阵时,我收到错误“分段错误 - 核心转储”我检查并重新检查了尺寸问题,但它们似乎是正确的,所以我想知道可能是什么错误的。当我输入 m=200 而不是 m=300 时,它工作得很好。

例如,以下程序不起作用

    #include <iostream>
    #include <stdlib.h>

    extern "C"
    {
    #include <cblas.h>
    }



    using namespace std;

    int main()
    {
        double *a,*x, *y, *z;
        int m,k;
        m=300; k=200;

        a = (double *) malloc( m*k*sizeof( double ));
        x = (double *) malloc (k*sizeof(double));
        y = (double *) malloc (m*sizeof(double));
        z = (double *) malloc (m*sizeof(double));

        int i;

        for (i = 0; i < (m*k); ++i)
        {
            a[i] = 1;
        }

        for (i = 0; i < (k); ++i)
        {
            x[i] = 1;
        }

        for (i = 0; i < (m); ++i)
        {
            y[i] = 100 ;
        }

        cblas_dcopy(m,y,1,z,1);
        cblas_dgemv(CblasRowMajor,CblasNoTrans,m,k,1.0, a ,m ,x, 1, 1.0, z, 1);


        for (int i = 0; i<m; ++i)
        {
             cout<<z[i]<<endl;
        }

        free (a);
        free (x) ;
        free (y) ;
        free (z) ;

        return 0;
        }

非常感谢提前

4

1 回答 1

0

我已经解决了问题:blas 文档中给出的参数 LDA(矩阵之后的参数)对应于他们所说的“矩阵的前导维度”。您必须仅在 COLMAJOR 系统(由 Fortran 使用)中将矩阵的行数作为 LDA 传递,如果您在 C 或 C++ 中使用 cblas,则必须将列数作为 LDA 传递,因为使用了 ROWMAJOR 系统。

希望这可以帮助将来的人

于 2016-03-05T15:25:45.390 回答