need help optimizing this code...

2 Ansichten (letzte 30 Tage)
Walter
Walter am 27 Mär. 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;
end
end
dTot = dTot * 2;

Akzeptierte Antwort

Andrei Bobrov
Andrei Bobrov am 28 Mär. 2012
Variant
ws = w.*s;
dTot = bsxfun(@times,ws,triu(ones(numel(w),1)*ws.',1));
dTot = sum(dTot(:))*2;

Weitere Antworten (4)

Teja Muppirala
Teja Muppirala am 28 Mär. 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;
end
dTot = dTot * 2
[EDITED:]
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))
  3 Kommentare
Teja Muppirala
Teja Muppirala am 28 Mär. 2012
Is X + X is faster than 2*X? I'm not really sure... but just trying it out, it seems they are both about the same to me.
Andrei Bobrov
Andrei Bobrov am 28 Mär. 2012
+1

Melden Sie sich an, um zu kommentieren.


Jakob Sørensen
Jakob Sørensen am 27 Mär. 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 Kommentar
Jakob Sørensen
Jakob Sørensen am 27 Mär. 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...

Melden Sie sich an, um zu kommentieren.


Kevin Holst
Kevin Holst am 27 Mär. 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 am 27 Mär. 2012
I would however use a loop:
ws = w.*s;
wssw = bsxfun(@times,ws,ws.');
sum(wssw(~eye(n)))

Kategorien

Mehr zu Loops and Conditional Statements finden Sie in Help Center und File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by