我该如何对此进行矢量化?

时间:2015-11-27 23:42:39

标签: matlab vectorization

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分钟内运行。任何人都可以建议进一步改进吗?谢谢!

1 个答案:

答案 0 :(得分:0)

我会将“如何将其矢量化”解释为“如何使其更快”,至少回答这个问题。除非您使用matlab 2015b或更新版本,否则访问类属性的速度很慢。绩效评估are available here

您可以使用临时变量来提高性能:

radonslice=self.radon(ind - 1, :, :, :, :)

然后在代码中使用radonslice(1, i1, i2, j1, j2)