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

作者: Ecampus (7.7)   2018-06-29 16:04:37
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!
作者: sppmg (sppmg)   2018-06-30 00:33:00
沒仔細看隨便回。parfor或是其他平行運算都有一個限制:平行部份一定要是獨立的,否則必須等待相依性處理完。你的for中xk會隨迴圈變動,並且影響x_kp,因此無法用parfor
作者: krsoon (孫博)   2018-06-30 00:59:00
你得迴圈前後iteration有相關,是不能用parfor的
作者: Ecampus (7.7)   2018-06-30 03:12:00
那請問公式1~公式5 也更快的寫法嗎@@我查GOOGLE 他說MATLAB矩陣相乘可以用類似 C=A.*B類似C=A.*B 這種模式....結果 我做起來 發現大大不妥這是另一種東西 所以我看GOOGLE看得有點搞暈= =
作者: sunev (Veritas)   2018-06-30 11:12:00
不要凡事都用sparse,不稀疏的矩陣硬用只會讓速度變慢

Links booklink

Contact Us: admin [ a t ] ucptt.com