zoukankan      html  css  js  c++  java
  • blas中dgemm_的用法

    blas中函数参数实在是太多,想要愉快的使用最好还是封装下

    一个矩阵相乘dgemm_函数就要13个参数.......

    fortran中是按列存储的矩阵,而c++中是按行存储的,虽然与cblas可以选择按什么方式存储,但就是不想用


    /*
    *****************/ //a 4行2列 //b 2行3列 //c 4行3列 /******************/ // 4 2 3 void myDgemm(double* a, double* b, double* c, int m, int k, int n) { char transa = 'N', transb = 'N'; double alpha = 1.0, beta = 0.; dgemm_(&transb, &transa, &n, &m, &k, &alpha, b, &n, a, &k, &beta, c, &n); } int _tmain(int argc, _TCHAR* argv[]) { /* a = 1 2 b = 2 1 0 c = 14 19 14 3 4 6 9 7 30 39 28 1 5 32 46 35 6 2 24 24 14 */ // 按列存储a可以看成是矩阵a的转置 按列存储的b可以看成是矩阵b的转置 // a(T) = 1 3 1 6 (b)T = 2 6 // 2 4 5 2 1 9 // 0 7 // Tb和Ta就是b和a的数据按列存储的结果 // 所以b的转置乘以a的转置 = (b)T*(a)T = (ab)T = (c)T // 得出的结果便是c的转置(c)T,而又由于fortran中是按列存储,所以在c/c++里得出的就是按行存储的c double a[8] = { 1, 2, 3, 4, 1, 5, 6, 2 }; double b[6] = { 2, 1, 0, 6, 9, 7 }; double c[12] = { 0 };

    myDgemm(a,b,c, 4, 2, 3)
    for (int i = 0; i < 4; i++)
    {
    for (int j = 0; j < 3; j++)
    { cout
    << c[i * 3 + j] << " ";
    }

    cout << endl;
    }
    cout << endl; getchar(); return 0; }
  • 相关阅读:
    Canvas文本绘制
    Canvas贝塞尔三级曲线
    Canvas贝塞尔二级曲线
    Canvas arcTo绘制圆弧
    mybatis springmvc调用oracle存储过程,返回记录集
    java调用oracle存储过程,返回结果集
    oracle存储过程返回结果集
    存储过程变量类型定义与表字段一致
    HTML5获取当前的经纬度坐标
    实现精灵沿着圆形轨迹运动
  • 原文地址:https://www.cnblogs.com/nkzhangkun/p/4579480.html
Copyright © 2011-2022 走看看