matlab - Vectorizing in Multiple Dimensions -


i have following loop in matlab code i'd rid of:

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 tried replacing i 1:size(thepolygon,3), dimensions don't line element-by-element multiplication, , i'm not sure else try. in advance tips.

it's difficult test without example data but:

activevalues = squeeze(sum(bsxfun(@times, normalvectors, thepolygon), 2)) 

ok first test data:

a = rand(3,3,3); b = rand(3,3); 

now test yours

for i=1:size(a,3)     c(:,i) = sum(b.*a(:,:,i),2); end 

on run got:

c =      0.9773    1.0608    0.3673     0.6670    0.1597    0.7296     0.8372    1.1418    0.9828 

and mine:

squeeze(sum(bsxfun(@times, b, a), 2)) 

i get

ans =      0.9773    1.0608    0.3673     0.6670    0.1597    0.7296     0.8372    1.1418    0.9828 

so assuming mine correct.

explanation:

bsxfun(@times, b, a) broadcasting, expands b along it's singleton dimension (in case dim 3) match size of a , applies function (@times .*) element element expanded b , a. identical (but better practice , faster) going repmat(b, [1 1 size(a,3)]).*a.

then sum 3d matrix column wize have, i.e. sum(x, 2) returns 1x3x3 result. want 3x3 result rid of singelton dimension (i.e. dim 1 equals 1) used squeeze

it should trivial vectorize second line in same way.

but

tic; k = 1:10000 c = squeeze(sum(bsxfun(@times, b, a), 2)); end; toc elapsed time 0.394828 seconds.  tic; c = zeros(3,3); k = 1:10000 i=1:size(a,3) c(:,i) = sum(b.*a(:,:,i),2); end; end; toc elapsed time 0.113199 seconds. 

the non-vectorized code faster in matlasb 2012b!!!!!!!


Comments

Popular posts from this blog

java - Jmockit String final length method mocking Issue -

asp.net - Razor Page Hosted on IIS 6 Fails Every Morning -

c++ - wxwidget compiling on windows command prompt -