作者candy88257 (阿泰斯)
看板MATLAB
標題Re: [討論] 改寫成parfor完成,但某些間隔會跑出錯誤!
時間Thu Apr 25 09:24:39 2013
※ 引述《candy88257 (阿泰斯)》之銘言:
: 例如:
: function connect=Qdata(v1,v2,v3)
: syms a
: data=[];
: steps=((v2-v1)/v3)+1;
: hwait=waitbar(0,'wait');
: for vv=v1:v3:v2
: str=['計算vv中,共',num2str((((v2-v1)/v3)+1)),'個vv,','第
: ',num2str((((vv-v1)/v3)+1)),'個vv'];
: waitbar((((vv-v1)/v3)+1)/steps,hwait,str);
: mm=[a,vv,3+a;a+vv,2+a,1+a;a,2*a,a+2*vv];
: eq=det(mm);
: eqans=solve(eq,'a');
: data=[data,eqans];
: end
: close(hwait);
: connect=data;
: end
: 上面那段要怎改寫成parfor並行運算?
: 求高手幫助!
: 感謝!
先不管data的順序,目前想先把parfor弄好
我自己改寫成這樣:
function connect=Qdata(v1,v2,v3) %v1最小值; v2 max; v3 間隔
matlabpool local 8
a=sym('a');
data=[];
vall=fix(((v2-v1)/v3)+1);
%會加個fix是因為常常有1.00這種東西出現,而程式就會跑出錯誤
parfor ii=1:vall
vv=v1+v3*(ii-1)
mm=[a,vv,3+a;a+vv,2+a,1+a;a,2*a,a+2*vv];
%真實的矩陣不方便放上來,但其他地方寫法應該依樣
eq=det(mm);
eqans=solve(eq,'a');
data=[data,eqans];
end
connect=data;
matlabpool close
end
首先,我測試過確定原版的for的寫法可以跑任何間隔(v3)以及任何v1~v2的範圍
但改成parfor後,發現v3=1 or 0.1都可以跑,但v3=0.01的時候(如:Qdata(0,5,0.01))
會跑出錯誤,而且是算到一半才出現錯誤(大約50%)
錯誤如下:
Error using parallel_function (line 589)
Error in MuPAD command: Invalid argument. [stdlib::from64]
Evaluating: symobj::fromString
Error in Qdata (line 8)
parfor ii=1:vall
字面上的意思是無效的參數
但是實在看不出來哪裡有無效的參數...
懇求高手幫助!!
感謝!!
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.130.17.157
1F:→ candy88257:iHakka大大您太厲害了,我把data那幾行刪掉就沒出現那 04/25 10:41
2F:→ candy88257:個錯誤了! 04/25 10:41
3F:→ candy88257:但在parfor裡面要怎麼把資料存進data?? 04/25 10:41
4F:推 iHakka:help parfor 04/25 15:33
5F:→ candy88257:老實講我問問題之前都會做到頭腦快爆炸了才出來問... 04/25 16:10
6F:→ candy88257:我是真的不知道help parfor裡面哪裡有寫有關按順序存 04/25 16:11
7F:→ candy88257:資料的教學... 04/25 16:11
8F:→ iHakka:他有範例寫他怎麼存資料我不認為很難看懂 04/25 16:55
9F:→ iHakka:想想怎麼用利用idx 04/25 16:57
10F:→ candy88257:好的,我會正仔細看help。但是,想問一下 04/25 17:42
11F:→ candy88257:把data=[data,eqans]那行改成for jj=1:3 04/25 17:44
12F:→ candy88257:data=[data;[eqans(jj),vv]] 04/25 17:45
13F:→ candy88257:end 這樣好像解出來會自動幫我們按照vv排列 04/25 17:45
14F:→ candy88257:但怎麼也是在間隔0.01在運算的時候會出錯? 邏輯有錯? 04/25 17:46