Matlab 如何将其矢量化?
这里“新”的大小,p1,p2,电流是TRxTR,氡是N_时间步x TR x TR x TR x TR 基本上,我在这里做的是一个固定的时间步长“ind”,使用转移概率p1*p2*radon计算前一个时间步长“ind-1”上的期望值 谢谢大家! 更新: 我能够将其半矢量化,如下所示:Matlab 如何将其矢量化?,matlab,vectorization,Matlab,Vectorization,这里“新”的大小,p1,p2,电流是TRxTR,氡是N_时间步x TR x TR x TR x TR 基本上,我在这里做的是一个固定的时间步长“ind”,使用转移概率p1*p2*radon计算前一个时间步长“ind-1”上的期望值 谢谢大家! 更新: 我能够将其半矢量化,如下所示: new = zeros(TR); for i1 = 1 : TR for i2 = 1 : TR for j1 = 1 : TR for j2 = 1 : TR
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
所以现在它的运行时间是16秒,而不是2分钟。有人能提出更多的改进建议吗?谢谢 我将“如何将其矢量化”解释为“如何使其更快”,至少回答这个问题。除非使用Matlab2015b或更新版本,否则访问类属性的速度很慢。性能测量
您可以使用临时变量来提高性能:
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
然后在代码中使用radonslice(1,i1,i2,j1,j2)
。我将“如何将其矢量化”解释为“如何使其更快”,至少回答这个问题。除非使用Matlab2015b或更新版本,否则访问类属性的速度很慢。性能测量
您可以使用临时变量来提高性能:
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
然后在代码中使用
radonslice(1,i1,i2,j1,j2)
。self.radon
是的,self.radon只是一个类属性。我将删除self以减少混淆。请将其保留在代码中。我认为这是你失去大部分表现的地方!为什么呢你是说matlab JIT编译器无法优化它吗?self.radon
是的,self.radon只是一个类属性。我将删除self以减少混淆。请将其保留在代码中。我认为这是你失去大部分表现的地方!为什么呢你是说MatlabJIT编译器不能优化它吗?嗯,你的链接讨论的是类方法,而不是属性。我尝试使用radodslice,但实际上速度较慢:整个模拟只需6分钟,而不是2分钟。这两次90%以上的时间都花在这些嵌套循环中。对不起。事实上,这一变化略微加快了速度。我估计错了:)问题是关于方法,但基准也包含属性,搜索classdef属性:
有没有加速“挤压”的方法?哈哈,现在matlab profiler说大部分时间都花在那里了……你可以尝试置换矩阵,一旦超出循环r2=permute(radon[4,5,1,2,3])
交换维度,然后r2(:,:,ind-1,i1,i2)
Hm,您的链接讨论的是类方法,而不是属性。我尝试使用radodslice,但实际上速度较慢:整个模拟只需6分钟,而不是2分钟。这两次90%以上的时间都花在这些嵌套循环中。对不起。事实上,这一变化略微加快了速度。我估计错了:)问题是关于方法,但基准也包含属性,搜索classdef属性:
有没有加速“挤压”的方法?哈哈,现在matlab profiler说大部分时间都花在那里了……你可以尝试置换矩阵,一旦超出循环r2=permute(radon[4,5,1,2,3])
交换维度,然后r2(:,:,ind-1,i1,i2)