pacoyang 发表于 2008-12-26 08:58:03

有没有办法加快速度计算

matlab中加快的方法也看过几种,比如说循环变距阵运算,大数组的中途计算不要变维数,等等。对于下面情况有没有其他办法。
function d2Ea=d2Euler3angcal(g0,gxs)
d2Ea=zeros(size(gxs,1),size(g0,1));
for i=1:size(g0,1)
    G0=Gcal(g0(i,);
    for j=1:size(gxs,1)
      G=Gcal(gxs(j,);
      d2Ea(j,i)=acos(max(min((trace(G*G0.')-1)/2,1),-1));
    end
    disp();
end
g0和gxs都是3列多行的矩阵,每行都是三个角度。g0目前有12000行(数量中等),gxs也有1380(算是比较少的)。函数Gcal是用下面公式计算一个矩阵,其为三个矩阵乘积,角度为上面提到的那三个角度。计算速度很不如意。有没有办法加快。
ps:我的机器是2G内存,2.8Ghz

[ 本帖最后由 pacoyang 于 2008-12-26 09:01 编辑 ]

pacoyang 发表于 2008-12-26 09:08:02

我还记得那时候学C语言时候有这样做法可以加快:频繁调用函数很耗时间,有个命令可以把所代用函数的代码插到调用出(编译阶段插入,不是直接把那段代码拷贝过来)。那个命令好像是内联函数(记不清楚了),matlab的内联函数不是这个意思呀

taohe 发表于 2008-12-26 09:14:29

是多核cpu吗?matlab的版本是多少,如果是多核可以考虑用新版的matlab,然后用并行计算,重写最外面的那个for循环,或者里面的那个for循环。

另外,看起来这是对某个算法比较直接的实现,看看能不能从解析分析的基础上优化算法实现。

pacoyang 发表于 2008-12-26 09:40:39

原帖由 taohe 于 2008-12-26 09:14 发表 http://forum.simwe.com/images/common/back.gif
是多核cpu吗?matlab的版本是多少,如果是多核可以考虑用新版的matlab,然后用并行计算,重写最外面的那个for循环,或者里面的那个for循环。

另外,看起来这是对某个算法比较直接的实现,看看能不能从解析分析的基 ...
我用的7.0R14,新版matlab能并行计算。程序还得改呀,麻烦不

junziyang 发表于 2008-12-27 17:06:35

把这句去掉应该会快不少:disp();
貌似可以不用循环,但我这里没有数据,无法试,你的程序本身也有错误( G0=Gcal(g0(i,);
)。

pacoyang 发表于 2008-12-27 21:51:20

原帖由 junziyang 于 2008-12-27 17:06 发表 http://forum.simwe.com/images/common/back.gif
把这句去掉应该会快不少:disp();
貌似可以不用循环,但我这里没有数据,无法试,你的程序本身也有错误( G0=Gcal(g0(i,);
)。
谢谢。原本没错,贴上去老是少个冒号。
这个问题今天可以说解决了,还是万变不离其宗。
两个矩阵相乘求迹等这些可以先用符号表达式表达出来,是有点长,但是没关系。然后用subs代换。代换时可能出现out of memory, 可以把矩阵分成多块来做,很快。原来可能要计算20-30分钟,现在2-3分钟。
页: [1]
查看完整版本: 有没有办法加快速度计算