2 votes

Comment implémenter efficacement le code suivant dans MATLAB ?

M=50
G= randi(100,100,2);
N = 100;
iS = zeros(M,M);
for i1 = 1:M
  for i2 = 1:M
      if i1 == i2
          for g = 1:N
              iS(i1,i2) = iS(i1,i2) + eq(i1,G(g,1))+eq(i2,G(g,2));
          end
      else
          for g = 1:N
              iS(i1,i2) = iS(i1,i2)-(eq(i1,G(g,1))*eq(i2,G(g,2))+eq(i1,G(g,2))*eq(i2,G(g,1)));
          end
      end

  end 
end

J'essaie d'implémenter ce code de manière efficace dans MATLAB. L'exécution semble prendre trop de temps. Existe-t-il un moyen d'implémenter ce code de manière efficace ?

G est un tableau double de 1000*2.

1voto

rahnema1 Points 9765

La boucle peut être réduite à la forme vectorisée suivante. Notez qu'elle utilise la multiplication matricielle pour accélérer le calcul.

i1 = 1:M;
i2 = 1:M;
iS = -((i1 == G(:, 1)).' * (i2 == G(:, 2)) + (i1 == G(:, 2)).' * (i2 == G(:, 1)));
iS(1:M+1:end) = sum(i1 == G(:, 1)) + sum(i2 == G(:, 2));

Pour la dernière partie, vous pouvez également utiliser histcounts :

i1 = 1:M;
i2 = 1:M;
iS = -((i1 == G(:, 1)).' * (i2 == G(:, 2)) + (i1 == G(:, 2)).' * (i2 == G(:, 1)));
iS(1:M+1:end) = histcounts(G(:, 1), 1:M+1) + histcounts(G(:, 2), 1:M+1);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X