0

我想摆脱的 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

我尝试用 替换i1:size(thePolygon,3)但尺寸不适合逐个元素的乘法,我不确定还能尝试什么。提前感谢您的任何提示。

4

1 回答 1

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)进行广播时,它会b沿其单例维度(在本例中为 dim 3)扩展以匹配 的大小,a然后将函数(@times只是.*)逐个元素应用于扩展后的band 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 中更快!!!!!!!

于 2013-05-08T19:09:30.813 回答