Performance matlab中矢量化的简单实现
我对matlab是新手。通过一个简单的例子,我想了解矢量化。如何将以下代码段矢量化Performance matlab中矢量化的简单实现,performance,matlab,for-loop,vectorization,Performance,Matlab,For Loop,Vectorization,我对matlab是新手。通过一个简单的例子,我想了解矢量化。如何将以下代码段矢量化 for i = 1:z binno = binno + f*floor(clip(:,:,i)*bins/256); f=f*bins; end 这是一个非常简单的代码,但我需要了解如何正确地将其矢量化。问题是f在每次循环后都会重新计算。 编辑:Binno是2d矩阵,Clip是3d,f和BIN是标量。有时写下前几个循环的值,然后找到模式会有所帮助。向量F(每次迭代一个条目)从第一个F(我们称之为f0)开
for i = 1:z
binno = binno + f*floor(clip(:,:,i)*bins/256);
f=f*bins;
end
这是一个非常简单的代码,但我需要了解如何正确地将其矢量化。问题是f在每次循环后都会重新计算。
编辑:Binno是2d矩阵,Clip是3d,f和BIN是标量。有时写下前几个循环的值,然后找到模式会有所帮助。向量F(每次迭代一个条目)从第一个
F
(我们称之为f0
)开始。然后第二个条目是f0*bins
。然后是f0*bins^2
,等等。因此F
是f0*1个bins^2个bins^3]…
可以计算为
F = f0 * bins .^ (0:z-1);
因为箱子^0是1
即使在此之前,您也可以一次计算整个floor
操作:floor(clip*bins/256)
。现在你只需要弄清楚如何用三维矩阵MxNxP乘以P元素向量Fbsxfun
将执行此类操作,但维度需要匹配,或者正好为1。所以F必须是1x1xP,而不是P。然后沿着三维方向求和
binno=sum(bsxfun(@times,floor(clip*bins/256),重塑(F,[1长度(F)]),3)代码>
只是一张纸条。。。如果您的输入至少按大小定义,那么这个问题将更容易回答。更好的方法是使用几行代码生成正确尺寸的样本数据。由于没有,我无法测试上述代码,因此您有责任使其适应您的数据。有时写下前几个循环的值,然后找到模式会有所帮助。向量F(每次迭代一个条目)从第一个F
(我们称之为f0
)开始。然后第二个条目是f0*bins
。然后是f0*bins^2
,等等。因此F
是f0*1个bins^2个bins^3]…
可以计算为
F = f0 * bins .^ (0:z-1);
因为箱子^0是1
即使在此之前,您也可以一次计算整个floor
操作:floor(clip*bins/256)
。现在你只需要弄清楚如何用三维矩阵MxNxP乘以P元素向量Fbsxfun
将执行此类操作,但维度需要匹配,或者正好为1。所以F必须是1x1xP,而不是P。然后沿着三维方向求和
binno=sum(bsxfun(@times,floor(clip*bins/256),重塑(F,[1长度(F)]),3)代码>
只是一张纸条。。。如果您的输入至少按大小定义,那么这个问题将更容易回答。更好的方法是使用几行代码生成正确尺寸的样本数据。由于没有,我无法测试上述代码,因此您有责任使其适应您的数据。您可以通过三个步骤来完成:
创建一个因子向量;让它一乘一乘z
fact = f .* bins.^(0:z-1);
fact = reshape(fact,1,1,[]);
乘以系数
tmp = bsxfun(@times,floor(clip*bins/256),fact);
总结一切
binno = sum(tmp,3);
您可以通过三个步骤完成此操作:
创建一个因子向量;让它一乘一乘z
fact = f .* bins.^(0:z-1);
fact = reshape(fact,1,1,[]);
乘以系数
tmp = bsxfun(@times,floor(clip*bins/256),fact);
总结一切
binno = sum(tmp,3);
你能解释一下尺寸吗?我猜clip
是3D,binno
是2D矩阵,f
和bin
是标量?@DedekMraz是的,你是对的。我会更新这个问题。关于如何将其矢量化,您有什么建议吗?您能解释一下尺寸吗?我猜clip
是3D,binno
是2D矩阵,f
和bin
是标量?@DedekMraz是的,你是对的。我会更新这个问题。关于如何将其矢量化,有什么建议吗?在我的原始代码中,如果我需要在循环结束后重用f的值,即循环中f的最终值,我该如何在这里执行?@Panther:您可以使用fact(end)
来使用f
的最终值。有可能得到不同的结果吗?我还想得到我在原始循环结束时在原始循环中得到的f值。@Panther:哦,我刚刚注意到-在原始循环中,f
的最终值实际上是f_final=f*bins^z
。在我的原始代码中,如果我需要在循环结束后重用f值,也就是循环中f的最终值我在这里怎么做?@Panther:你可以使用fact(end)
来使用f的最终值
。有可能得到不同的结果吗?我还想得到原始循环结束时在原始循环中得到的f值。@Panther:哦,我刚刚注意到-原始循环中f
的最终值实际上是f\u final=f*bins^z
。