Re: [討論] 改寫成parfor完成,但某些間隔會跑出錯誤!

看板MATLAB作者 (阿泰斯)時間13年前 (2013/04/25 09:24), 編輯推噓1(1013)
留言14則, 2人參與, 最新討論串1/1
※ 引述《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

04/25 10:41, , 1F
iHakka大大您太厲害了,我把data那幾行刪掉就沒出現那
04/25 10:41, 1F

04/25 10:41, , 2F
個錯誤了!
04/25 10:41, 2F

04/25 10:41, , 3F
但在parfor裡面要怎麼把資料存進data??
04/25 10:41, 3F

04/25 15:33, , 4F
help parfor
04/25 15:33, 4F

04/25 16:10, , 5F
老實講我問問題之前都會做到頭腦快爆炸了才出來問...
04/25 16:10, 5F

04/25 16:11, , 6F
我是真的不知道help parfor裡面哪裡有寫有關按順序存
04/25 16:11, 6F

04/25 16:11, , 7F
資料的教學...
04/25 16:11, 7F

04/25 16:55, , 8F
他有範例寫他怎麼存資料我不認為很難看懂
04/25 16:55, 8F

04/25 16:57, , 9F
想想怎麼用利用idx
04/25 16:57, 9F

04/25 17:42, , 10F
好的,我會正仔細看help。但是,想問一下
04/25 17:42, 10F

04/25 17:44, , 11F
把data=[data,eqans]那行改成for jj=1:3
04/25 17:44, 11F

04/25 17:45, , 12F
data=[data;[eqans(jj),vv]]
04/25 17:45, 12F

04/25 17:45, , 13F
end 這樣好像解出來會自動幫我們按照vv排列
04/25 17:45, 13F

04/25 17:46, , 14F
但怎麼也是在間隔0.01在運算的時候會出錯? 邏輯有錯?
04/25 17:46, 14F
文章代碼(AID): #1HU8NQZR (MATLAB)
文章代碼(AID): #1HU8NQZR (MATLAB)