need help optimizing this code...

2 visualizaciones (últimos 30 días)
Walter
Walter el 27 de Mzo. de 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;

Respuesta aceptada

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

Más respuestas (4)

Teja Muppirala
Teja Muppirala el 28 de Mzo. de 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 comentarios
Teja Muppirala
Teja Muppirala el 28 de Mzo. de 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 el 28 de Mzo. de 2012
+1

Iniciar sesión para comentar.


Jakob Sørensen
Jakob Sørensen el 27 de Mzo. de 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 comentario
Jakob Sørensen
Jakob Sørensen el 27 de Mzo. de 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...

Iniciar sesión para comentar.


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

Categorías

Más información sobre Loops and Conditional Statements en Help Center y File Exchange.

Community Treasure Hunt

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

Start Hunting!

Translated by