在多维度中进行矢量化

时间:2013-05-08 18:53:40

标签: matlab vectorization

我在我的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),但尺寸不符合逐个元素的乘法,我不知道还有什么可以尝试。提前感谢任何提示。

1 个答案:

答案 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只是.*)元素逐个展开ba。这与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中的非向量化代码更快!!!!!!!