2014-07-07 4 views
0

J'écris un code dans lequel la réduction de la vitesse et du temps est vraiment importante. Je dois créer des matrices en répétant certains vecteurs. Comme mes vecteurs sont presque grands, utiliser repmat pour créer ces matrices prend relativement longtemps. Y a-t-il un autre moyen de réduire ce temps?Alternative de repmat pour les grands vecteurs dans matlab

+2

Voir si cela est assez inspirant - http://stackoverflow.com/questions/22847086/how-to-replicate- an-array – Divakar

+5

Pourquoi avez-vous besoin de répliquer ces vecteurs en premier lieu? peut-être vous pouvez éviter cette réplication en utilisant 'bsxfun'? – Shai

+0

Bien que je n'exclus pas la possibilité de battre repmat, ce n'est pas si mal. En tant que tel, vous voudrez probablement regarder dans la création et l'utilisation de vos matrices. –

Répondre

4

Notre vecteur de test:

V0 = [1; 2; 3]; 

trick Tony:

V1 = V0(:, ones(3,1)) 

La multiplication de matrices/vecteur:

V2 = V0 * ones(1,3);  

produit Kronecker:

V3 = kron(V0, ones(1,3)) 

Concaténation:

V4 = [V0 V0 V0] 

façon Inobvious:

V5 = arrayfun(@(~)V0, 1:3, 'uniformoutput', false); 
V5 = cat(2, V5{:}); 

La façon la moins évidente:

[Vi{1:3}] = deal(V0); 
V6 = [Vi{:}] 

Utilisez repmat du Lightspeed toolbox.

Ou, la meilleure façon, utiliser l'expansion implicite (R2008 et plus):

%# NOTE: this PREVENTS having to do explicit replication, and carries 
%# out the multiplication re-using the same elements from V0: 
M = bsxfun(@times, rand(1,5), V0) 
+0

Pour le dernier je m'attendrais 'ones (1,5)' ou 'ones (3,5)'. Petit sidenote pour le demandeur: peut-être pas toutes ces méthodes se révélera plus rapide que repmat. –

+0

@DennisJaheruddin: le dernier est de montrer que vous n'avez pas besoin du vecteur explicitement répliqué, mais que vous pouvez effectuer n'importe quelle multiplication/addition/etc. avec réplication implicite.Par conséquent, j'ai nommé la sortie 'M' et pas' V7' :) –

+1

@DennisJaheruddin: Aussi, vous avez raison :) 'repmat' est assez rapide, et l'implémentation dans la boîte à outils lightspeed perd pour MATLAB moderne, sauf dans un quelques cas de niche à peine rencontrés. Et même alors, ce n'est presque jamais le goulot d'étranglement. Je soupçonne que le PO a un problème complètement différent. Je m'amusais juste à essayer de trouver d'autres façons de le faire :) –

Questions connexes