中易网

C||C++语言高分求高效的矩阵相乘程序

答案:3  悬赏:30  
解决时间 2021-11-10 00:36
矩阵 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;
}
谁能帮我在提升一点效率啊

电灯剑客 能不能给点指点,偶的确是比较菜的菜鸟
最佳答案
不用考虑了,你的程序差太多,能达到CPU峰值的十分之一就不错了。
如果只要求高速,去找一个比较好的BLAS库调用一下就可以,比如ATLAS、GOTOBLAS、MKL、ACML、IMCL(前两个免费)。
如果坚持自己写,首先一定用C,不要用C++,然后把矩阵分块(不是让你改变存贮方式,只是改变计算次序),再手工把循环展开,把加法和乘法错开。如果你的参数选取得当,并且写得非常考究,有希望达到BLAS库的30%-40%(目前的C编译器无法把三重循环优化到最高性能)。不过根据你这段代码的质量,估计你半年之内是做不到那么好的。

再补充一句:不要相信所谓Straussen算法或其他divide and conquer型算法能更快,在现在的计算机上没希望,虽然工作量确实小了一点。
全部回答
既然对称矩阵用半存储矩阵,用一维数组就能表示
关于算法我研究得太粗浅了,这种问题还是去CSDN问吧,呵呵
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
年保玉则的旅游环境如何?求旅游攻略。
梦见肥皂的心理学解梦是什么意思?好不好呢?
老时风电汽车八块电池少一块能开吗?
家具贴膜和贴纸哪个好?
引领企踵的意思?成语怎么解释?
我想开一个全场20元的时尚,休闲男女服装店,
哪位知道关于 上海大众 配件在哪能拿到啊?我
嘉定牙防所补牙多少钱
牙齿表面出现黑色
倍消掉单立人怎么加偏旁
梦见蚂蚁咬手是什么意思?好不好呢?
如何巧除书本上黑色碳素笔的字迹
如何提高施工现场管理水平
伤不起是什么意思,什么叫伤不起,伤不起的歌
六安哪里 有卖手机 充值卡的 ? 移动联通都可
推荐资讯
孩子左上腹痛是怎么回事
一个等腰梯形周长48厘米,腰长9厘米,下底比上
江西南昌地区喷码机公司哪家好?
外国ems直邮到贵州会过那个海关?
毛坯房画水平线是干什么用的?怎么画,以什么标
骂人法院会怎么判
蓝天装修灯具总汇地址有知道的么?有点事想过
梦见五月是什么意思?好不好呢?
万和和海尔燃气热水器哪个好
双人会议桌尺寸多大合适
喜欢穿性感内衣裤的女人是不是性欲强
200平装修多少钱
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?