我是靠谱客的博主 丰富月亮,最近开发中收集的这篇文章主要介绍matlab矩阵替代for,用矩阵运算代替FOR循环,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

在数据量很大的情况下,用矩阵运算可代替FOR循环,使运算速度大大加快。

我想问的是,如果一个FOR循环中,有很多if、continue等条件语句或循环语句,还能变成矩阵运算吗?

我有个程序需要循环几百万次,速度非常慢,请大家赐教!谢谢。

例如下面的程序,

for i=1:cyc-1

if (Smax(i)>=Smaxol(i));

Smaxol(i+1)=Smax(i);

ol=i;

else

Smaxol(i+1)=Smax(ol);

end

Yre=sqrt((1.0/cos(PI*re/w)));

alpha0=KIc/(sigmau*sqrt(PI*re)*(1.0+Yre/sqrt(2.0)));

if alpha0>sqrt(2.0);

sigmav=sigmau*PI/2.0/acos(1.0/(alpha0^2.0-1.0));

else

error('PLEASE TO CHECK THE VALUE OF ALHPA0!');

break;

end

R(i)=Smin(i)/Smax(i);

Y=sqrt((1.0/cos(PI*a(i)/w)));

Yol=sqrt((1.0/cos(PI*a(ol)/w)));

Kmax(i)=sqrt(PI*re*(1.0/cos(PI*Smax(i)/2.0/sigmav)+1.0))*(1.0+Y*sqrt(a(i)/2.0/re))*Smax(i);

Kmaxol(i)=sqrt(PI*re*(1.0/cos(PI*Smaxol(i+1)/2.0/sigmav)+1.0))*(1.0+Yol*sqrt(a(ol)/2.0/re))*Smaxol(i+1);

deltaK(i)=(1-R(i))*Kmax(i);

alpha_1=1.0/(1.0-2.0*mu)+(1.0-1.0/(1.0-2.0*mu))/(1.0+0.8861*(t/(Kmax(i)/sigmay)^2.0)^3.2251)^0.75952;

AA0=(0.825-0.34*alpha_1+0.05*alpha_1^2.0)*(cos(PI*Smax(i)/2.0/sigmaf))^(1.0/alpha_1);

AA1=(0.415-0.071*alpha_1)*Smax(i)/sigmaf;

AA3=2.0*AA0+AA1-1.0;

AA2=1.0-AA0-AA1-AA3;

if 0<=R(i) && R(i)<1.0;

fop=max(R(i),AA0+AA1*R(i)+AA2*R(i)^2.0+AA3*R(i)^3.0);

else

fop=AA0+AA1*R(i);

end

if R(i)>=-2.0 && R(i)<0.0;

feff(i)=(0.52-0.1*R(i))/(1.0-R(i));

if mat==1.0;

fth(i)=(1.0-R(i))^0.84;

elseif  mat==2.0;

fth(i)=(1.0-R(i))^0.5;

end

end

if R(i)>=0.0 && R(i)<0.5;

feff(i)=0.52+0.42*R(i)+0.06*R(i)^2.0;

if mat==1.0;

fth(i)=(1-R(i))^0.7;

elseif mat==2.0 ;

fth(i)=(1-R(i))^0.3;

end

end

if R(i)>=0.5 && R(i)<1.0;

feff(i)=0.52+0.42*R(i)+0.06*R(i)^2.0;

if  mat==1.0;

fth(i)=(1.05-1.4*R(i)+0.6*R(i)^2.0)^0.7;

elseif  mat==2.0;

fth(i)=(1.05-1.4*R(i)+0.6*R(i)^2.0)^0.3;

end

end

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

deltaKu=Y*sqrt(PI*a(i))*(Smin(i)-Smin(i+1));

alpha1=(1.0-1.65*mu)^2.0/5.0-1.0/(20.0*n0)*(1.0-1.65*mu)^(2.0/n0)+(1.0/PI-1.0/(2.2*n0)*(1.0/PI)^(1.0/n0)-((1.0-1.65*mu)^2.0/5.0-1.0/(20.0*n0)*((1.0-1.65*mu)^2.0)^(1.0/n0)))/(1.0+(t/(Kmax(i)/sigmay)^2.0)/(1.0+1.0/n0))^(1.6+1.0/n0);

alpha2=(1.0-1.65*mu)^2.0/5.0-1.0/(20.0*n0)*(1.0-1.65*mu)^(2.0/n0)+(1.0/PI-1.0/(2.2*n0)*(1.0/PI)^(1.0/n0)-((1.0-1.65*mu)^2.0/5.0-1.0/(20.0*n0)*((1.0-1.65*mu)^2.0)^(1.0/n0)))/(1.0+(t/(Kmaxol(i)/sigmay)^2.0)/(1.0+1.0/n0))^(1.6+1.0/n0);

ry(i)=alpha1*(Kmax(i)/sigmay)^2.0;

rol(i)=alpha2*(Kmaxol(i)/sigmay)^2.0;

deltar=alpha1*(deltaKu/sigmay)^2.0;

lamda=(1.0-1.65*mu)^2.0/5.0-1.0/(20.0*n0)*(1.0-1.65*mu)^(2.0/n0)+(1.0/PI-1.0/(2.2*n0)*(1.0/PI)^(1.0/n0)-((1.0-1.65*mu)^2.0/5.0-1.0/(20.0*n0)*((1.0-1.65*mu)^2.0)^(1.0/n0)))/(1.0+(t/(Kmax(i)/sigmay)^2.0)/(1.0+1.0/n0))^(1.6+1.0/n0);

Kc=(((1.0-2.0*mu)^2.0-sqrt(1.0-mu^2.0))*PI*lamda/((1.0-2.0*mu)^2.0-1.0)/(1.0-2.0*mu)^2.0+(sqrt(1.0-mu^2.0)-1.0)/((1.0-2.0*mu)^2.0-1.0))*KIc;

if a(i)+ry(i)

mf=((a(ol)+rol(i)-ry(i)-deltar)/a(i))^c;

deltaKeff(i)=Kmax(i)*(1-mf*fop);

else

mf=1.0;

deltaKeff(i)=Kmax(i)*(1-mf*fop);

Smaxol(i+1)=Smax(i);

ol=i;

end

if deltaKeff(i)>deltaKeffth(i);

if Kmax(i)

da(i)=AA*(deltaKeff(i)-deltaKeffth(i))^mm/(1.0-(Kmax(i)/Kc)^nn);

a(i+1)=a(i)+da(i);

N(i)=i;

else

Nf=N(i-1);

af=a(i);

result=[Nf;af;Kmax(i)];

save result.dat result -ascii;

break;

end

else

da(i)=0;

a(i+1)=a(i)+da(i);

continue;

end

end

最后

以上就是丰富月亮为你收集整理的matlab矩阵替代for,用矩阵运算代替FOR循环的全部内容,希望文章能够帮你解决matlab矩阵替代for,用矩阵运算代替FOR循环所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部