Performance 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)开

我对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
)开始。然后第二个条目是
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元素向量F
bsxfun
将执行此类操作,但维度需要匹配,或者正好为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元素向量F
bsxfun
将执行此类操作,但维度需要匹配,或者正好为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