C||C++语言高分求高效的矩阵相乘程序
答案:3 悬赏:30
解决时间 2021-11-10 00:36
- 提问者网友:逝爱
- 2021-11-09 20:32
矩阵 A:m*n,矩阵B n*m行,矩阵C = A*B;因为里面的矩阵特殊性,求得的矩阵为对称矩阵,
现在求一高效的算法:
目前 本人做了两方面的努力:
第一:根据对称性,本人只求一半矩阵,另外一半矩阵赋值,时间减少一半;
第二:先将矩阵B进行转置,让A乘以矩阵B的转置,让A的行乘以B的行,得到矩阵C ,因为是连续读数据,效率 又提高一倍
代码如下:
int MulMatrix(double *mtrx1,int row1,int col1,double *mtrx2,int row2,int col2,double *mtrx3)
//矩阵相乘:矩阵mtrx1和矩阵mtrx2相乘的矩阵mtrx3,row1,row2分别为矩阵1,2的行,col1,col2分别为矩阵1,2的列
{
register int i,j,k;
//start = clock();
for(i=0;i for(j=i;j {
mtrx3[i*row+j]=0;
for(k=0;k {
mtrx3[i*row+j]+=mtrx1[i*col1+k]*mtrx2[j*col2+k];
}
mtrx3[j*row+i]=mtrx3[i*row+j];
}//矩阵mtrx3除最后一列,最后一行之外的元素
return 1;
}
谁能帮我在提升一点效率啊
电灯剑客 能不能给点指点,偶的确是比较菜的菜鸟
最佳答案
- 二级知识专家网友:猎杀温柔
- 2021-11-09 22:06
不用考虑了,你的程序差太多,能达到CPU峰值的十分之一就不错了。
如果只要求高速,去找一个比较好的BLAS库调用一下就可以,比如ATLAS、GOTOBLAS、MKL、ACML、IMCL(前两个免费)。
如果坚持自己写,首先一定用C,不要用C++,然后把矩阵分块(不是让你改变存贮方式,只是改变计算次序),再手工把循环展开,把加法和乘法错开。如果你的参数选取得当,并且写得非常考究,有希望达到BLAS库的30%-40%(目前的C编译器无法把三重循环优化到最高性能)。不过根据你这段代码的质量,估计你半年之内是做不到那么好的。
再补充一句:不要相信所谓Straussen算法或其他divide and conquer型算法能更快,在现在的计算机上没希望,虽然工作量确实小了一点。
全部回答
- 1楼网友:情窦初殇
- 2021-11-09 23:59
既然对称矩阵用半存储矩阵,用一维数组就能表示
- 2楼网友:woshuo
- 2021-11-09 22:21
关于算法我研究得太粗浅了,这种问题还是去CSDN问吧,呵呵
我要举报
大家都在看
推荐资讯