[問題] 請問這一段code,怎麼改成parfor並行運算

看板Programming作者時間6年前 (2018/06/29 16:08), 編輯推噓1(104)
留言5則, 2人參與, 6年前最新討論串1/1
I=sparse(eye(6000,6000)); O=[一個3084行*1列的矩陣]; y=O' dt=1; gg=[6.7525 -12 6.2475]; hh=eye(6000); bb=sparse(conv2(hh,gg,'same')); C=[bb]; M = sparse(eye(6000)); H = sparse(zeros(1,6000)); H(1,2300) = 1; Q = sparse(3*eye(6000)); R = 1; x0=[一個6000行*1列的矩陣] %X_saved 用來存放每隔時間點,濾波估計值值 %X_saved 的第i行就是,濾波在時間i分鐘的估計值 %在i分鐘卡爾曼濾波估計值,是一個6000維的行向量 %該向量由上到下,代表河川 100,200,300,...,3600公尺的估計值(透過濾波估計) X_befored = sparse(zeros(6000,N)); X_saved = sparse(zeros(6000,N)); Pk = sparse(eye(6000)); xk = x0; for k=2:N x_kp = A*xk; %公式 1 X_befored(:, k-1) = x_kp; P_kp = A*Pk*A'+ Q; %公式 2 K = (P_kp*H') / (H*P_kp*H'+ R); %公式 3 xk = x_kp + K*(y(k-1)-H*x_kp); %公式 4 %將公式4 計算得到的在k時間的濾波估計值 xk ,存在X_saved的第 k-1 行 X_saved(:, k-1) = xk; Pk = (I - K*H)*P_kp; %公式 5 end %提取濾波估計值中的,第2300列 %2300列,代表在河水2300 公尺處,從0秒~3084秒的染劑濃度估計值 xhat_2300 = X_saved(2300,:); t=1:dt:3084; %一個時間單位為1秒 figure; plot(t,y,t,xhat_2300); title('在河川 2300 公尺處的測量值與濾波估計'); xlabel('時間(每1分)'); ylabel('染劑濃度'); legend('測量值','Kalman estimator'); xlim([0,3500]); %限制x軸畫圖範圍 =========================== 跑下去,跳出這個錯誤。 Error: The temporary variable xk in a parfor is uninitialized. See Parallel for Loops in MATLAB, "Uninitialized Temporaries". 因為對於pardor而言,xk這個變數無法初始化。 我猜測是,PARFOR功能不允許循環體中出現對矩陣的某些部分獨立地計算。 但是因為不太熟悉parfor的並行運算概念,所以改了code幾次,都不對 囧 有高手或熟悉並行計算的朋友路過還請指教。 我剛剛有看一下用gpu來解矩陣的方法, 想說之後用gpu、parfor,運算速度應該會快很多a_a! -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 125.224.111.120 ※ 文章網址: https://www.ptt.cc/bbs/Programming/M.1530259733.A.764.html

06/29 18:02, 6年前 , 1F
你只是矩陣運算的話不用到平行處理吧 都
06/29 18:02, 1F

06/29 18:02, 6年前 , 2F
用matlab了想辦法把矩陣用矩陣乘法加速計
06/29 18:02, 2F

06/29 18:02, 6年前 , 3F
算啊
06/29 18:02, 3F

06/29 19:53, 6年前 , 4F
平行處理感覺比較快說~難道是我錯覺囧
06/29 19:53, 4F

06/30 13:50, 6年前 , 5F
結果這矩陣沒辦法用PARFOR = =
06/30 13:50, 5F
文章代碼(AID): #1RDUaLTa (Programming)
文章代碼(AID): #1RDUaLTa (Programming)