【问题标题】:Simple vectorization implementation in matlabmatlab中的简单向量化实现
【发布时间】:2013-02-26 17:37:19
【问题描述】:

我是 matlab 新手。通过一个简单的例子,我想了解矢量化。如何矢量化以下代码 sn-p。

for i = 1:z
  binno = binno + f*floor(clip(:,:,i)*bins/256);
  f=f*bins;
end

这是一个非常简单的代码,但我确实需要了解如何正确对其进行矢量化。问题是每次循环后都会重新计算 f。 编辑:Binno 是 2d 矩阵,Clip 是 3d,f 和 bin 是标量。

【问题讨论】:

  • 您能说明一下尺寸吗?我猜clip 是 3D,binno 是 2D 矩阵,fbins 是标量?
  • @DedekMraz 是的,你是对的。我会更新这个问题。关于如何矢量化它的任何建议?

标签: performance matlab for-loop vectorization


【解决方案1】:

您可以分三个步骤完成此操作:

  1. 创建一个因子向量;使其成为 1×1×z

    fact = f .* bins.^(0:z-1);
    fact = reshape(fact,1,1,[]);
    
  2. 将剪辑乘以因子

    tmp = bsxfun(@times,floor(clip*bins/256),fact);
    
  3. 总结一切

    binno = sum(tmp,3);
    

【讨论】:

  • 在我的原始代码中,如果我需要在循环结束后重用 f 的值,即循环中 f 的最终值,我该怎么做呢?
  • @Panther:你可以使用fact(end)来使用f的最终值。
  • 有没有可能得到不同的结果?我还想在原始循环结束时获得原始循环中的 f 值。
  • @Panther:哦,我刚刚注意到 - 在原始循环中 f 的最终值实际上是 f_final = f*bins^z
【解决方案2】:

有时写下前几个循环的值,然后找到模式会有所帮助。向量 F(每次迭代一个条目)从第一个 f(我们称之为 f0)开始。然后第二个条目是f0*bins。然后f0*bins^2 等。所以Ff0*[1 bins bins^2 bins^3]... 并且可以计算为

F = f0 * bins .^ (0:z-1);

因为 bins^0 是 1。

甚至在此之前,您就可以一次计算整个 floor 操作:floor(clip*bins/256)。现在你只需要弄清楚如何将你的 P 元素向量 F 乘以那个 3D 矩阵 MxNxP。 bsxfun 会做这种事情,但是尺寸需要匹配,或者正好是 1。所以 F 必须是 1x1xP 而不是 P。然后只需将整个事情沿第三维求和。

binno = sum(bsxfun(@times, floor(clip*bins/256), reshape(F, [1 1 length(F)])), 3);

请注意...使用至少按大小定义的输入会更容易回答这个问题。更好的是生成正确尺寸的样本数据的几行。由于没有,我无法测试上面的代码,因此您有责任将其适应您的数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-09
    • 1970-01-01
    • 2015-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多