看板 MATLAB 關於我們 聯絡資訊
※ 引述《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
candy88257:iHakka大大您太厲害了,我把data那幾行刪掉就沒出現那 04/25 10:41
candy88257:個錯誤了! 04/25 10:41
candy88257:但在parfor裡面要怎麼把資料存進data?? 04/25 10:41
iHakka:help parfor 04/25 15:33
candy88257:老實講我問問題之前都會做到頭腦快爆炸了才出來問... 04/25 16:10
candy88257:我是真的不知道help parfor裡面哪裡有寫有關按順序存 04/25 16:11
candy88257:資料的教學... 04/25 16:11
iHakka:他有範例寫他怎麼存資料我不認為很難看懂 04/25 16:55
iHakka:想想怎麼用利用idx 04/25 16:57
candy88257:好的,我會正仔細看help。但是,想問一下 04/25 17:42
candy88257:把data=[data,eqans]那行改成for jj=1:3 04/25 17:44
candy88257:data=[data;[eqans(jj),vv]] 04/25 17:45
candy88257:end 這樣好像解出來會自動幫我們按照vv排列 04/25 17:45
candy88257:但怎麼也是在間隔0.01在運算的時候會出錯? 邏輯有錯? 04/25 17:46