我在我的Matlab代码中有以下for循环我想摆脱:
for i=1:size(thePolygon,3)
activeValues(:,i) = sum(normalVectors.*thePolygon(:,:,i),2);
checkValues(:,i) = sign(activeValues(:,i)-sum(normalVectors.*thePolygon3(:,:,i),2));
end
我尝试用i
替换1:size(thePolygon,3)
,但尺寸不符合逐个元素的乘法,我不知道还有什么可以尝试。提前感谢任何提示。
答案 0 :(得分:0)
如果没有示例数据,很难进行测试,但是:
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)
进行广播,它会沿着它的单一维度(在本例中为dim 3)展开b
以匹配a
的大小,然后应用函数(@times
只是.*
)元素逐个展开b
和a
。这与repmat(b, [1 1 size(a,3)]).*a
相同(但更好的做法和更快)。
然后我们像你一样将这个三维矩阵列wize相加,即sum(x, 2)
返回一个1x3x3的结果。但我想要一个3x3的结果,以便摆脱singelton维度(即dim 1,因为它等于1)我使用squeeze
现在以同样的方式对第二行进行矢量化应该是微不足道的。
的 BUT 强> 的
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中的非向量化代码更快!!!!!!!