我是matlab的新手。通过一个简单的例子,我想了解矢量化。如何矢量化以下代码片段。
for i = 1:z
binno = binno + f*floor(clip(:,:,i)*bins/256);
f=f*bins;
end
这是一个非常简单的代码,但我确实需要了解如何正确对其进行矢量化。问题是在每次循环后重新计算 f。编辑: Binno 是 2d 矩阵,Clip 是 3d 和 f,bin 是标量。
我是matlab的新手。通过一个简单的例子,我想了解矢量化。如何矢量化以下代码片段。
for i = 1:z
binno = binno + f*floor(clip(:,:,i)*bins/256);
f=f*bins;
end
这是一个非常简单的代码,但我确实需要了解如何正确对其进行矢量化。问题是在每次循环后重新计算 f。编辑: Binno 是 2d 矩阵,Clip 是 3d 和 f,bin 是标量。
您可以分三个步骤执行此操作:
创建因子向量;使其成为 1×1×z
fact = f .* bins.^(0:z-1);
fact = reshape(fact,1,1,[]);
将剪辑乘以因子
tmp = bsxfun(@times,floor(clip*bins/256),fact);
总结一切
binno = sum(tmp,3);
有时写下前几个循环的值会有所帮助,然后找到模式。向量 F(每次迭代一个条目)从第一个开始f
(我们称之为f0
)。然后第二个条目是f0*bins
. 然后f0*bins^2
,等等。所以F
是f0*[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);
请注意...如果您的输入至少按大小定义,则可以更轻松地回答这个问题。更好的是生成正确尺寸的样本数据的几行。由于没有,我无法测试上面的代码,因此您有责任将其适应您的数据。