matlab中的简单矢量化实现

时间:2013-02-26 17:37:19

标签: 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是标量。

2 个答案:

答案 0 :(得分:3)

您可以分三步完成:

  1. 创建一系列因子;使它逐1乘以

    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);
    

答案 1 :(得分:1)

有时写下前几个循环的值会有所帮助,然后找到模式。向量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);

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