没有示例数据很难测试,但是:
activeValues = squeeze(sum(bsxfun(@times, normalVectors, thePolygon), 2))
好的,首先是一些测试数据:
a = rand(3,3,3);
b = rand(3,3);
现在我们测试你的
for i=1:size(a,3)
c(:,i) = sum(b.*a(:,:,i),2);
end
在我的跑步中,我得到了:
c =
0.9773 1.0608 0.3673
0.6670 0.1597 0.7296
0.8372 1.1418 0.9828
现在我的:
squeeze(sum(bsxfun(@times, b, a), 2))
我明白了
ans =
0.9773 1.0608 0.3673
0.6670 0.1597 0.7296
0.8372 1.1418 0.9828
所以我假设我的是正确的。
解释:
bsxfun(@times, b, a)
进行广播时,它会b
沿其单例维度(在本例中为 dim 3)扩展以匹配 的大小,a
然后将函数(@times
只是.*
)逐个元素应用于扩展后的b
and a
。这与 go 相同(但更好的实践和更快)repmat(b, [1 1 size(a,3)]).*a
。
然后我们像你一样对这个 3D 矩阵列 wize 求和,即sum(x, 2)
返回 1x3x3 结果。但我想要一个 3x3 的结果,以便摆脱我使用的单维数(即暗淡 1,因为它等于 1)squeeze
现在以相同的方式对第二行进行矢量化对您来说应该是微不足道的。
但
tic; for k = 1:10000 c = squeeze(sum(bsxfun(@times, b, a), 2)); end; toc
Elapsed time is 0.394828 seconds.
tic; c = zeros(3,3); for k = 1:10000 for i=1:size(a,3)
c(:,i) = sum(b.*a(:,:,i),2);
end; end; toc
Elapsed time is 0.113199 seconds.
非矢量化代码在 MATLASB 2012b 中更快!!!!!!!