我是matlab的新手。通过一个简单的例子,我想了解矢量化。如何对以下代码段进行矢量化。
for i = 1:z
binno = binno + f*floor(clip(:,:,i)*bins/256);
f=f*bins;
end
这是一个非常简单的代码,但我需要了解如何正确地对其进行矢量化。问题是在每个循环后重新计算f。 编辑:Binno是一个2d矩阵,Clip是3d和f,bin是标量。
答案 0 :(得分:3)
您可以分三步完成:
创建一系列因子;使它逐1乘以
fact = f .* bins.^(0:z-1);
fact = reshape(fact,1,1,[]);
按因子乘以剪辑
tmp = bsxfun(@times,floor(clip*bins/256),fact);
总结一切
binno = sum(tmp,3);
答案 1 :(得分:1)
有时写下前几个循环的值会有所帮助,然后找到模式。向量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.然后只需将整个事物沿第三维求和。
binno = sum(bsxfun(@times, floor(clip*bins/256), reshape(F, [1 1 length(F)])), 3);
只是一个注释...这个问题将更容易回答你的输入至少按大小定义。更好的是生成正确尺寸的样本数据的几行。由于没有,我无法测试上述代码,因此您有责任使其适应您的数据。