Dans mon programme, j'ai besoin de calculer la somme:Est-il possible de rendre ce code MATLAB vectorisé plus rapide?
.
Je calcule cette somme 2500 fois avec de nouvelles valeurs de C
et z
.
Argument z peut être un vecteur. J'ai écrit simple pour boucle et le code de la version vectorisée comme suit:
K = 200;
n_z = 40000;
C = ones(K,1); % an example, in real life the arey some coefficients (at next call will be new)
k = 0:K-1;
z = linspace(0, 2*pi, n_z); % at next call will be new
tic;
my_sum_for = zeros(1, K);
for i=1:n_z
my_sum_for(i) = C' * tan(k' * z(i));
end
toc; % Elapsed time is 1.820485 seconds.
tic;
my_sum = C' * tan(k' * z);
toc; % Elapsed time is 0.160924 seconds.
la version est plus rapide vectorisé, mais pas assez. Est-il possible d'améliorer la version vectorisée?
Après la réponse de Dominique Jacquel J'ai cette version vectorisée, il est plus rapide:
K = 200;
n_z = 40000;
C = ones(K,1)'; % an example, in real life they are some coefficients (at next call will be new)
k = (0:K-1)';
z = linspace(0, 2*pi, n_z); % at next call will be new
tic;
my_sum_for = zeros(1, K);
for i=1:n_z
my_sum_for(i) = C * tan(k * z(i));
end
toc; % Elapsed time is 1.521587 seconds.
tic;
my_sum = C * tan(k * z);
toc; % Elapsed time is 0.125468 seconds.
Est-il possible d'améliorer la version vectorisée encore plus (bsxfun, arrayfun ou quelque chose)? Le temps de 250 secondes est encore lent pour moi (c'est 75% de toutes les computations).
'all (my_sum_for == my_sum) -> ans = 0' ... donc, vous n'avez pas vérifié cela? Il me semble que vous faites une transposition étrange qui n'est pas nécessaire .., –
J'ai vérifié cela en calculant la norme (my_sum_for, my_sum) = 1.7861e-10. Ce n'est pas nouveau pour moi que les versions vectorisées et en boucle du même code produisent des résultats légèrement différents. – N0rbert
Le contenu actuel de 'C' est-il vraiment juste? Et il y a quelques éléments répétés dans la matrice 'k * z' que vous pourriez ignorer en calculant le' tan' de, mais étant donné les valeurs de 'K' et' n_Z', il n'y a pas grand chose à y sauvegarder. –