2017-10-03 3 views
0

Dans une partie de mon code, je l'ai utilisé repmat pour un très grand vecteurOptimisation de code Matlab qui utilise repmat

vecO=repmat(vec,1,9); 
fi = repmat(vecO',1,400)-A; 

VEC est un 1 par 400 matrice et 'A' est un 3600 de 400 matrice. Je pense qu'il devrait y avoir beaucoup moins de temps que d'utiliser repmat mais je ne sais pas quelle est la méthode. Est-ce que quelqu'un a une idée?

Répondre

1

On dirait que votre résultat (dans votre question fi) est censé contenir la différence de vec0 avec chaque colonne de A. Cela signifie qu'au lieu d'utiliser repmat pour développer vec0 à la même taille que A (en générant 400 réplicats), vous pouvez appliquer une opération par élément à deux tableaux avec expansion implicite en utilisant bsxfun. L'utilisation de cette fonction ne fera pas de copies de vec0 mais devrait aboutir au même résultat. Le premier argument spécifie la fonction à appliquer aux deux tableaux, ici il s'agit simplement de minus.

result = bsxfun(@minus, vec0.', A); 
+0

est-il plus rapide que d'utiliser repmat? –

+0

Je ne suis pas sûr ... vaut la peine – Adiel

+0

J'ai ajouté cela comme un test dans ma "réponse" – Steve

0

Voici un test de modèle à utiliser, y compris mikkola's answer:

vec = rand(1,400); 
A = rand(3600,400); 
n_expts = 1000; 
format long 
disp(version); 

% Warm up 
for ii = 1:n_expts 
    vec0 = repmat(vec,1,9); 
    res1 = repmat(vec0',1,400)-A; 
    res3 = bsxfun(@minus, vec0.', A); 
end 

tic 
for ii = 1:n_expts 
    vec0 = repmat(vec, 1, 9); 
    res1 = repmat(vec0.', 1, 400) - A; 
end 
fprintf('Time taken with 2 repmats: ') 
disp(toc/n_expts) 

tic 
for ii = 1:n_expts 
    res2 = repmat(vec.', 9, 400) - A; 
end 
fprintf('Time taken with 1 repmat and transpose: ') 
disp(toc/n_expts) 

tic 
for ii = 1:n_expts 
    res3 = bsxfun(@minus, vec0.', A); 
end 
fprintf('Time taken with bsxfun: ') 
disp(toc/n_expts) 

% Check that all the fi are the same 
dres1 = max(max(abs(res1 - res2))); 
dres2 = max(max(abs(res1 - res3))); 
tol = eps; 
if (dres1 > eps) | (dres2 > eps) 
    fprintf('Difference in output matrices'); 
end 

Avec des résultats

8.3.0.532 (R2014a) 
Time taken with 2 repmats: 0.004027661867427 

Time taken with 1 repmat and transpose: 0.004034170491803 

Time taken with bsxfun: 0.003970521454027 
+0

Merci. Très intéressant que deux appels à 'repmat' sont plus rapides qu'un appel avec deux dimensions se développent. – Adiel

+0

@Adiel Oui, c'était à l'origine ma suggestion. En fait, c'était à l'origine 'repmat (vec, 400, 9) '- A', mais cela a pris environ 3 fois plus de temps. – Steve