24小时热门版块排行榜    

查看: 485  |  回复: 2
当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖

harp

木虫 (正式写手)

[求助] Matlab循环的“诡异”问题

问题:可以运行一次两排“%%%%%%%%%%” 之间的代码,也就是被循环语句,而且结果合理,速度非常快,按下enter就能显示结果,这应该能说明这段代码没有问题吧?

可加上for语句后运行起来却不行,运行的非常慢,一直busy,等不到结果;另外,就算把两排“%%%%%%%%%%” 之间的代码复制重新运行也不行;使用clear命令清楚后再复制运行也不行,除非重启matlab才能运行。

这是怎么回事啊???求高人指教

xm=zeros(42,10);
for i=1:10

%%%%%%%%%%%%%%%%%%%%%%

C=[0.002026883,0.007821721,0.023555797,0.014122603,0.027523128,0.019160052,0.05981332,0.072422514,0.277256157,0.496297825];

P=C(1);
Ti=C(2);
K=C(3);
Na=C(4);
Mg=C(5);
S=C(6);
Fe=C(7);
Ca=C(8);
Al=C(9);
Si=C(10);

x=zeros(42,1);


%P
r1=rand(2,1);
xP=(r1/sum(r1))*P;
x(3)=xP(1)/3;
x(6)=xP(2)/2;
Ca=Ca-5*x(3)-x(6);
Al=Al-3*x(6);

%Ti
r2=rand(2,1);
xTi=(r2/sum(r2))*Ti;
x(41)=xTi(1);
x(42)=xTi(2);

%K
r3=rand(3,1);
xK=(r3/sum(r3))*K;
x(25)=xK(1)/1.5;
x(26)=xK(2);
x(27)=xK(3);
Al=Al-5.49999*x(25)-x(26);
Si=Si-6.5*x(25)-3*x(26);
S=S-2*x(27);
Fe=Fe-3*x(27);

%Na
St=-1;
Mgt=-1;
while (St<=0)||(Mgt<=0)
Nat=Na;
Mgt=Mg;
St=S;
Fet=Fe;
Cat=Ca;
Alt=Al;
Sit=Si;
r4=rand(8,1);
xNa=(r4/sum(r4))*Nat;
x(32)=xNa(1)/0.33;
x(33)=xNa(2)/0.7;
x(34)=xNa(3)/2;
x(35)=xNa(4)/2;
x(36)=xNa(5);
x(37)=xNa(6);
x(38)=xNa(7);
x(39)=xNa(8);
Alt=Alt-1.67*x(32)-2.6*x(33)-x(36)-x(37)-x(38);
Mgt=Mgt-0.33*x(32)-0.7*x(33);
St=St-2*x(34)-x(35)-2*x(39);
Fet=Fet-3*x(39);
Cat=Cat-x(34);
Sit=Sit-4*x(32)-8*x(33)-2*x(37)-3*x(38);
end

Mg=Mgt;
S=St;
Fe=Fet;
Ca=Cat;
Al=Alt;
Si=Sit;

%Mg
r5=rand(5,1);
xMg=(r5/sum(r5))*Mg;
x(9)=xMg(1);
x(28)=xMg(2);
x(29)=xMg(3);
x(30)=xMg(4);
x(31)=xMg(5);
S=S-x(31);
Fe=Fe-2*x(29);
Ca=Ca-x(9);
Al=Al-2*x(28);

%S
r6=rand(9,1);
xS=(r6/sum(r6))*S;
x(10)=xS(1);
x(11)=xS(2);
x(12)=xS(3);
x(13)=xS(4);
x(14)=xS(5)/3;
x(21)=xS(6)/2;
x(22)=xS(7)/2;
x(23)=xS(8);
x(24)=xS(9);

Fe=Fe-0.875*x(13)-2*x(14)-x(21)-x(22)-x(23)-x(24);
Ca=Ca-x(10)-x(11)-x(12);

%Fe
r7=rand(6,1);
xFe=(r7/sum(r7))*Fe;
x(15)=xFe(1)/2;
x(16)=xFe(2)/3;
x(17)=xFe(3)/5;
x(18)=xFe(4);
x(19)=xFe(5);
x(20)=xFe(6);

Al=Al-2*x(17);
Si=Si-3*x(17);

%Ca
r8=rand(4,1);
xCa=(r8/sum(r8))*Ca;
x(4)=xCa(1);
x(5)=xCa(2);
x(7)=xCa(3);
x(8)=xCa(4);

Al=Al-2*x(4)-2*x(5);
Si=Si-2*x(4)-7*x(5);

%Al
r9=rand(2,1);
xAl=(r9/sum(r9))*Al;
x(1)=xAl(1)/2;
x(2)=xAl(2);
Si=Si-2*x(1);

%Si
x(40)=Si;

xm(:,i)=x;

%%%%%%%%%%%%%%%%%%%%

end
回复此楼

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

harp

木虫 (正式写手)

引用回帖:
Originally posted by lds588 at 2011-07-11 18:36:34:
[code]clear
clc
xm=zeros(42,10);
for i=1:1

%%%%%%%%%%%%%%%%%%%%%%

C=[0.002026883,0.007821721,0.023555797,0.014122603,0.027523128,0.019160052,0.05981332,0.072422514,0.277256157,0.4962978 ...

非常感谢你的热心帮助,给你添麻烦了~~~
3楼2011-07-11 21:20:17
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
查看全部 3 个回答

lds588

铁杆木虫 (著名写手)

愚钝

【答案】应助回帖

★ ★ ★
xiegangmai(金币+3): 谢谢应助! 2011-07-11 19:41:47
harp(金币+50): 受教了,非常感谢!! 2011-07-11 19:51:46
引用回帖:
Originally posted by harp at 2011-07-11 15:36:19:
问题:可以运行一次两排“%%%%%%%%%%” 之间的代码,也就是被循环语句,而且结果合理,速度非常快,按下enter就能显示结果,这应该能说明这段代码没有问题吧?

可加上for语句后运行起来却不行,运行的非常慢, ...

CODE:
clear
clc
xm=zeros(42,10);
for i=1:1

%%%%%%%%%%%%%%%%%%%%%%

C=[0.002026883,0.007821721,0.023555797,0.014122603,0.027523128,0.019160052,0.05981332,0.072422514,0.277256157,0.496297825];

P=C(1);
Ti=C(2);
K=C(3);
Na=C(4);
Mg=C(5);
S=C(6);
Fe=C(7);
Ca=C(8);
Al=C(9);
Si=C(10);

x=zeros(42,1);


%P
r1=rand(2,1);
xP=(r1/sum(r1))*P;
x(3)=xP(1)/3;
x(6)=xP(2)/2;
Ca=Ca-5*x(3)-x(6);
Al=Al-3*x(6);

%Ti
r2=rand(2,1);
xTi=(r2/sum(r2))*Ti;
x(41)=xTi(1);
x(42)=xTi(2);

%K
r3=rand(3,1);
xK=(r3/sum(r3))*K;
x(25)=xK(1)/1.5;
x(26)=xK(2);
x(27)=xK(3);
Al=Al-5.49999*x(25)-x(26);
Si=Si-6.5*x(25)-3*x(26);
S=S-2*x(27);
Fe=Fe-3*x(27);

%Na
St=-1;
Mgt=-1;
k=0;
while (St<=0)||(Mgt<=0)
    k=k+1
Nat=Na;
Mgt=Mg;
St=S;
Fet=Fe;
Cat=Ca;
Alt=Al;
Sit=Si;
r4=rand(8,1);
xNa=(r4/sum(r4))*Nat;
x(32)=xNa(1)/0.33;
x(33)=xNa(2)/0.7;
x(34)=xNa(3)/2;
x(35)=xNa(4)/2;
x(36)=xNa(5);
x(37)=xNa(6);
x(38)=xNa(7);
x(39)=xNa(8);
Alt=Alt-1.67*x(32)-2.6*x(33)-x(36)-x(37)-x(38);
Mgt=Mgt-0.33*x(32)-0.7*x(33);
St=St-2*x(34)-x(35)-2*x(39);
Fet=Fet-3*x(39);
Cat=Cat-x(34);
Sit=Sit-4*x(32)-8*x(33)-2*x(37)-3*x(38);
end

Mg=Mgt;
S=St;
Fe=Fet;
Ca=Cat;
Al=Alt;
Si=Sit;

%Mg
r5=rand(5,1);
xMg=(r5/sum(r5))*Mg;
x(9)=xMg(1);
x(28)=xMg(2);
x(29)=xMg(3);
x(30)=xMg(4);
x(31)=xMg(5);
S=S-x(31);
Fe=Fe-2*x(29);
Ca=Ca-x(9);
Al=Al-2*x(28);

%S
r6=rand(9,1);
xS=(r6/sum(r6))*S;
x(10)=xS(1);
x(11)=xS(2);
x(12)=xS(3);
x(13)=xS(4);
x(14)=xS(5)/3;
x(21)=xS(6)/2;
x(22)=xS(7)/2;
x(23)=xS(8);
x(24)=xS(9);

Fe=Fe-0.875*x(13)-2*x(14)-x(21)-x(22)-x(23)-x(24);
Ca=Ca-x(10)-x(11)-x(12);

%Fe
r7=rand(6,1);
xFe=(r7/sum(r7))*Fe;
x(15)=xFe(1)/2;
x(16)=xFe(2)/3;
x(17)=xFe(3)/5;
x(18)=xFe(4);
x(19)=xFe(5);
x(20)=xFe(6);

Al=Al-2*x(17);
Si=Si-3*x(17);

%Ca
r8=rand(4,1);
xCa=(r8/sum(r8))*Ca;
x(4)=xCa(1);
x(5)=xCa(2);
x(7)=xCa(3);
x(8)=xCa(4);

Al=Al-2*x(4)-2*x(5);
Si=Si-2*x(4)-7*x(5);

%Al
r9=rand(2,1);
xAl=(r9/sum(r9))*Al;
x(1)=xAl(1)/2;
x(2)=xAl(2);
Si=Si-2*x(1);

%Si
x(40)=Si;
%%%%%%%%%%%%%%%%%%%%
xm(:,i)=x;



end

代码 为了告诉你差别我在你的while循环处加一个变量k(52和54行为我所加)
把改后的代码多执行几次你就能发现问题(while语句执行次数的问题)

目的是看看while循环什么时候跳出,我发现当运算时间较长时,始终跳不出while语句
只有生成的随机数合理,才会很容易跳出while循环,所以会执行快一些,这是一个概率问题,与你是否重启matlab没有关系
[url=http://weibo.com/u/2577306830?s=6uyXnP][img]http://service.t.sina.com.cn/widget/qmd/2577306830/fa2fdb00/1.png[/img][/url]
2楼2011-07-11 18:36:34
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
信息提示
请填处理意见