2013-05-25 27 views
5

Was ist der effizienteste Weg, um einen Vektor zu wiederholen?Der effizienteste Weg, um einen Vektor in Matlab zu wiederholen

Ich habe derzeit den Eindruck, dass repmat anderen Methoden überlegen ist? Oder liege ich mit dieser Einstellung schrecklich falsch?

Wäre es möglich, das gleiche Ergebnis wie repmat mit einer anderen Technik zu erzeugen? Vielleicht gewöhnliche Matrixmultiplikation?

Ich möchte meine größte Dankbarkeit für all Ihre Interessen und unterstützende Antworten ausdrücken!

AER

Antwort

6

Unterm Strich bsxfun ist schneller als die beiden sie gefragt, ob der Startvektor ist lang oder die Anzahl der Wiederholungen ist groß genug (siehe unten), ansonsten Matrixmultiplikation effizienter ist. Zwischen den beiden, die Sie gefragt haben, sieht es so aus, als ob die Matrixmultiplikation + die Effizienz um einen Faktor von ~ 3 über repmat gewinnt. Ich habe verwendet timeit die folgende Art und Weise, ich habe einen Zufallsvektor von 1e5 Elementen erstellt und geprüft, wie lange es 100 Wiederholungen davon erstellen nimmt:

v=rand(1e5,1); 
[email protected]()repmat(v,[100,1]) 
[email protected]() reshape(v*ones(1,100),[],1); 

timeit(f1) 
ans = 
    0.1675 

timeit(f2) 
ans = 
    0.0516 

jedoch bsxfun ist noch schneller:

[email protected]() reshape(bsxfun(@times,v,ones(1,100)),[],1) 

timeit(f3) 

ans = 
    0.0374 

Hier ist eine sorgfältige Untersuchung dieser Beobachtung:

Bei einem Vektor 1000 Elemente lang ist, es 10 bis 1e5 maliger Wiederholung ergibt die folgenden Leistungszeiten:

enter image description here

Für kleinere Anzahl der Wiederholungen gibt es kaum einen Unterschied zwischen bsxfun und Matrix-Multiplikation, sondern als die Anzahl der Wiederholungen geht ~ 1e3, bsxfun deutlich gewinnt.

Wenn man jedoch einen Vektor mit nur 10 Elementen und der gleichen Anzahl von Wiederholungen verwendet, zeigt dies, dass die Matrixmultiplikation effizienter ist. bsxfun beginnt, besser zu sein erst nach 10^5 Wiederholungen, aber selbst dann ist es nur ca. 5% schneller (nicht dargestellt):

enter image description here

so hängt es wirklich das, was Sie nach. Weitere Diskussion findet sich in Loren on the Art of MATLAB blog.

0

Nein, zur Zeit repmat mostly is slow er als einfache Indizierung, die wie folgt funktioniert:

Classis repmat:

a = [ 1 2 3 ]; 
repmat(a,4,1) 
>> 
    [1 2 3; 
     1 2 3; 
     1 2 3; 
     1 2 3]; 

Indizierung Version dieser:

a(ones(4,1),:); 

, die das gleiche Ergebnis liefert .

0

es hängt wirklich ab, welche Art von Verktor Sie wollen.wenn Sie zum Beispiel mögen ein einen spezialisierten Vektor, wie Reihe von Einsen, dann

tic 
repmat([1],3,5) 
toc 

tic 
ones(3,5) 
toc 

werden Ihnen sagen, dass die Verwendung von „Einsen“ etwa 3-mal schneller (zumindest auf meinem Rechner). Sie können Tic und Toc immer verwenden, um zu messen, welche Methode schneller ist. Lässt ein anderes versuchen ...

tic 
repmat([1,2,3],1,2) 
toc 

tic 
cat(2,[1,2,3],[1,2,3]) 
toc 

jetzt cat 3-mal schneller wieder, aber es seine eigene offensichtliche Einschränkung hat. Hoffe, das hilft

Verwandte Themen