[讨论] 请问这一段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