lycid 发表于 2012-9-21 20:52:50

for循环中的矩阵运算 简化问题

本帖最后由 lycid 于 2012-9-21 20:53 编辑

我遇到了一个for循环中的矩阵运算问题,看能否不用for循环而准确实现,我为了把问题说清楚,可能比较啰嗦,若有兴趣请耐心看完,谢谢。
现有下面有一个小程序计算
x=2;
trans1=;
trans2=;
trans=trans1*trans2;
Ap=trans(1,1);
Bp=trans(1,2);
Cp=trans(2,1);
Dp=trans(2,2);
很容易得到结果。若x是一组数值,我的方式如下
x=;
forj=1:length(x)
trans1=;
trans2=;
trans=trans1*trans2;
Ap(j)=trans(1,1);
Bp(j)=trans(1,2);
Cp(j)=trans(2,1);
Dp(j)=trans(2,2);
end
也就是一个x值对应一组Ap到Dp四个矩阵元素值,我的问题是能否不用for循环而实现,这种问题很让我苦恼,for循环自然可准确实现,就是在x数值很多,同时矩阵也很多时,程序运算效率会很低 求高手能帮帮,非常感谢


rocwoods 发表于 2012-9-22 20:27:08

可以用sparse生成分块对角矩阵trans1和trans2,直接利用稀疏矩阵相乘,一次就可以算完。以前做过类似的计算,当x很长的时候,速度提高n倍。

lycid 发表于 2012-9-24 10:08:53

rocwoods 发表于 2012-9-22 20:27 static/image/common/back.gif
可以用sparse生成分块对角矩阵trans1和trans2,直接利用稀疏矩阵相乘,一次就可以算完。以前做过类似的计算 ...

吴老师的提示真是点石成金我用的思路是您其他帖子的回复(http://www.matlabsky.com/forum.php?mod=viewthread&tid=23672&highlight=)
A = cell(100,1);

for k = 1:100

A{k} = rand(2);

end

A{1} = sparse(A{1});

B = blkdiag(A{:});
我的trans矩阵可能也比较多(1-几十不等),在x的个数比较少时比如400 程序运行正常 x个数多的时候就会提示out of memory,我贴出自己的部分程序如下:
Mtot=eye(2*length(x));
for jj=1:Ntot
CELL{1} = sparse(CELL{1});
B{jj}= blkdiag(CELL{:,jj});
Mtot=Mtot*cell2mat(B(jj));
end
mm=1:length(x);
m11=diag(Mtot(2*mm-1,2*mm-1));
m12=diag(Mtot(2*mm-1,2*mm));
m21=diag(Mtot(2*mm,2*mm-1));
m22=diag(Mtot(2*mm,2*mm));
因为矩阵数目(原来用trans表示)随Ntot变化,所以多矩阵相乘用循环实现,有没有更好方法?再就是out of memory问题有没有好的解决办法,给些提示就行,非常感谢

rocwoods 发表于 2012-9-25 10:11:42

lycid 发表于 2012-9-24 10:08 static/image/common/back.gif
吴老师的提示真是点石成金我用的思路是您其他帖子的回复(http://www.matlabsky.com/forum.php?mod=vie ...

如果循环内部是粗粒度的计算,譬如你的jj = 1:Ntot这层循环,内部计算量比较大的,用循环不会构成瓶颈,不用担心。可以把精力放在jj循环体内部。对于Out of Memory,建议不要把所有的数据都准备在CELL里,每次循环只存本次循环需要的即可。

lycid 发表于 2012-9-25 11:41:16

rocwoods 发表于 2012-9-25 10:11 static/image/common/back.gif
如果循环内部是粗粒度的计算,譬如你的jj = 1:Ntot这层循环,内部计算量比较大的,用循环不会构成瓶颈, ...

非常感谢您的帮助
页: [1]
查看完整版本: for循环中的矩阵运算 简化问题