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:
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):
so hängt es wirklich das, was Sie nach. Weitere Diskussion findet sich in Loren on the Art of MATLAB blog.