【问题标题】:How do I vectorize this?我如何矢量化它?
【发布时间】:2015-11-27 23:42:38
【问题描述】:
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

这里“新”的大小,p1,p2,电流是TRxTR,氡气是N_timesteps x TR x TR x TR x TR。

我在这里所做的基本上是使用转移概率 p1 * p2 * radon 为固定时间步“ind”计算上一个时间步“ind -1”的期望。

谢谢!

更新:

我能够按如下方式对其进行半矢量化:

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 分钟。任何人都可以提出更多改进建议吗?谢谢!

【问题讨论】:

  • self.radon
  • 是的,self.radon 只是一个类属性。我将删除 self 以减少混乱。
  • 把它留在代码中。我认为那是您失去大部分性能的地方!
  • 怎么回事?你的意思是matlab JIT编译器不能优化这个吗?

标签: matlab vectorization


【解决方案1】:

我将“如何向量化”解释为“如何使其更快”,至少回答这个问题。除非您使用 matlab 2015b 或更高版本,否则访问类属性很慢。性能测量are available here

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

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

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

【讨论】:

  • 嗯,您的链接谈论的是类方法,而不是属性。我尝试使用 radodslice,它实际上更慢:整个模拟运行在 6 分钟而不是 2 分钟。两次都有 90% 以上的时间花在这些嵌套循环中。
  • 对不起。实际上,这种变化略有加速。我测错了:)
  • 问题是关于方法的,但是基准也包含属性,搜索classdef property:
  • 有什么方法可以加速“挤压”?哈哈,现在matlab profiler说大部分时间都花在了那里……
  • 您可以在循环外尝试permute 矩阵。 r2=permute(radon,[4,5,1,2,3]) 交换尺寸,然后 r2(:,:,ind - 1, i1, i2)
猜你喜欢
  • 1970-01-01
  • 2011-05-24
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-29
  • 2017-06-18
相关资源
最近更新 更多