0

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

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

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

4

2 回答 2

3

您可以分三个步骤执行此操作:

  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);
    
于 2013-02-26T18:03:38.027 回答
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。然后只需将整个事物沿第 3 维求和即可。

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

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

于 2013-02-26T18:03:14.297 回答