new = zeros(TR);
for i1 = 1 : TR
for i2 = 1 : TR
for j1 = 1 : TR
for j2 = 1 : TR
new(i1, i2) = new(i1, i2) + p1(i1, j1) * p2(i2, j2) * ...
self.radon(ind - 1, i1, i2, j1, j2) * ...
current(j1, j2);
end
end
end
end
这里“new”的大小,p1,p2,电流是TRxTR,而radon是N_timesteps x TR x TR x TR x TR。
基本上我在这里做的是使用转移概率p1 * p2 * radon对前一时间步“ind -1”计算期望的固定时间步“ind”。
谢谢!
更新
我能够按如下方式对其进行半矢量化:
for i1 = 1 : TR
for i2 = 1 : TR
new(i1, i2) = sum(sum((p1(i1, :)' * p2(i2, :)) .* ...
squeeze(self.radon(ind - 1, i1, i2, :, :)) .* current));
end
end
所以现在它在16秒而不是2分钟内运行。任何人都可以建议进一步改进吗?谢谢!
答案 0 :(得分:0)
我会将“如何将其矢量化”解释为“如何使其更快”,至少回答这个问题。除非您使用matlab 2015b或更新版本,否则访问类属性的速度很慢。绩效评估are available here。
您可以使用临时变量来提高性能:
radonslice=self.radon(ind - 1, :, :, :, :)
然后在代码中使用radonslice(1, i1, i2, j1, j2)
。