ice-huya 发表于 2011-12-24 17:36:59

求助:for循环中if语句的向量化

例如,原程序是一个for循环,根据R的值计算deltaKeffth

R=[-1;0;0.1;0.3;0.5;0.7;0.8;0.9;-0.5;0.2;-1.5]; %R为一个10*1矩阵
for i=1:length(R)
if R(i)>=-2.0 && R(i)<0.0;
      feff(i)=(0.52-0.1*R(i))/(1.0-R(i));
      fth(i)=(1.0-R(i))^0.5;
   end

if R(i)>=0.0 && R(i)<0.5;
      feff(i)=0.52+0.42*R(i)+0.06*R(i)^2.0;
         fth(i)=(1-R(i))^0.3;
end

   if R(i)>=0.5 && R(i)<1.0;
      feff(i)=0.52+0.42*R(i)+0.06*R(i)^2.0;
      fth(i)=(1.05-1.4*R(i)+0.6*R(i)^2.0)^0.3;
   end

deltaKeffth(i)=feff(i)*fth(i)

end


想把代码优化成向量运算的形式,以便在大量循环时优化计算,现写成:

feff=(R>=-2 & R<0)*(0.52-0.1*R./(1.0-R))+(R>=0 & R<1)*(0.52+0.42*R+0.06*R.^2);
fth=(R>=-2 & R<0)*((1-R)^0.5)+(R>=0 & R<0.5)*((1-R)^0.3)+(R>=0.5 & R<1)*((1.05-1.4*R+0.6*R^2)^0.3);
deltaKeffth=feff.*fth.


报错:
??? Error using ==> mtimes
Inner matrix dimensions must agree.

Error in ==> crack_SLH at 57
feff=(R>=-2 & R<0)*(0.52-0.1*R./(1.0-R))+(R>=0 & R<1)*(0.52+0.42*R+0.06*R.^2);



我刚接触向量化编程,请问一下问题出在哪?高手们,该怎样改?
请大家帮忙,谢谢啦!


lengyunfeng 发表于 2011-12-24 23:17:44

电脑上没装matlab,看了一下,应该是条件判断式(如(R>=-2 & R<0))后紧跟着*号所致,应该是用.*,因为条件式运算出来也是一个列向量,而*号后面跟着的也是列向量,两个同形式向量直接用*法相联是会出现mtimes错误提示的

ice-huya 发表于 2011-12-26 15:21:25

lengyunfeng 发表于 2011-12-24 23:17 static/image/common/back.gif
电脑上没装matlab,看了一下,应该是条件判断式(如(R>=-2 & R

十分感谢!

改用了.*还是相同的错误,请问一下,条件判断式后面的括号,如(0.52-0.1*R./(1.0-R)),到底该不该用./ 呢?

我用./就报错:

??? Error using ==> mpower
Matrix must be square.

Error in ==> R_youhua at 27
fth=(R>=-2 & R<0).*((1-R)^0.5)+(R>=0 & R<0.5).*((1-R)^0.3)+(R>=0.5 & R<1).*((1.05-1.4*R+0.6*R^2)^0.3);

lengyunfeng 发表于 2011-12-26 22:33:53

本帖最后由 lengyunfeng 于 2011-12-26 22:34 编辑

ice-huya 发表于 2011-12-26 15:21 http://forum.simwe.com/static/image/common/back.gif
十分感谢!

改用了.*还是相同的错误,请问一下,条件判断式后面的括号,如(0.52-0.1*R./(1.0-R)),到 ...

你这回错在了((1-R)^0.5)里的^上,应该是.^。再细心点你就应该能做对了

ice-huya 发表于 2011-12-27 15:16:08

lengyunfeng 发表于 2011-12-26 22:33 static/image/common/back.gif
你这回错在了((1-R)^0.5)里的^上,应该是.^。再细心点你就应该能做对了

谢谢谢谢!!!我明白了,细心点。。再细心点:)
页: [1]
查看完整版本: 求助:for循环中if语句的向量化