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; }