need help optimizing this code...

2 views (last 30 days)
Walter on 27 Mar 2012
how can I do this without a loop:
(consider vectors w and s of length n)...
dTot = 0;
for i=1:n
for j=i+1:n
v = w(i) * w(j) * (s(i)) * (s(j));
dTot = dTot + v;
dTot = dTot * 2;

Accepted Answer

Andrei Bobrov
Andrei Bobrov on 28 Mar 2012
ws = w.*s;
dTot = bsxfun(@times,ws,triu(ones(numel(w),1)*ws.',1));
dTot = sum(dTot(:))*2;

More Answers (4)

Teja Muppirala
Teja Muppirala on 28 Mar 2012
You can simplify the loop like this:
for i=1:n
v = w(i)*s(i)*sum( w(i+1:n) .* s(i+1:n) );
dTot = dTot + v;
dTot = dTot * 2
Aha! I knew there had to be an easier way to do this!
ws = w.*s;
Cws = cumsum(ws(n:-1:2));
dTot = 2 * (sum(ws(n-1:-1:1) .* Cws))

Sign in to comment.

Jakob Sørensen
Jakob Sørensen on 27 Mar 2012
Wouldn't it work with:
% Turn vectors to matrix form
W1 = repmat(w, [n 1]);
W2 = repmat(w',[1 n]);
% Multiply these
Wm = W1 .* W2;
% Turn vectors to matrix form
S1 = repmat(s, [n 1]);
S2 = repmat(s',[1 n]);
% Multiply these
Sm = S1 .* S2;
% Multiply Wm and Sm matrices
Vm = Wm .* Sm
% Sum up and multiply by 2
V = 2*sum(Vm(:))
Note that I haven't tested this, but i think it should work...
  1 Comment
Jakob Sørensen
Jakob Sørensen on 27 Mar 2012
Kinda missed the j = i+1 part, this changes quite a few things. But you might be able to modify the concept. Sorry about that...

Sign in to comment.

Kevin Holst
Kevin Holst on 27 Mar 2012
I don't think that will work actually. Try this, it's a little convoluted, but I think it's correct:
% this assumes w and s are row vectors
wm = triu(repmat(w,[n 1]),1);
sm = triu(repmat(s,[n 1]),1);
wsm = wm .* sm;
wsv = w .* s;
dTot = 2*(sum(wsv*wsm));
If you're wanting a one liner that no one will be able to read or understand then:
dTot = 2*(sum((w.*s)*(triu(repmat(w,[n 1]),1).*triu(repmat(s,[n 1]),1))));

Oleg Komarov
Oleg Komarov on 27 Mar 2012
I would however use a loop:
ws = w.*s;
wssw = bsxfun(@times,ws,ws.');


Find more on Loops and Conditional Statements in Help Center and File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by