alt çizgi, bsxfun
aksi matris çarpım daha etkilidir (aşağıya bakınız) başlangıç vektörü uzun veya tekrarların # yeterince büyükse istedi ikisi daha hızlıdır. İkisi arasında, matris çarpma + yeniden şekillendirmeyi, verimlilikte repmat
üzerinden ~ 3 faktörü ile kazanmış gibi görünmesini istediniz. Ben kullandım timeit
aşağıdaki şekilde de, 1E5 elemanlarının rastgele vektörü oluşturulur ve bu özellikten 100 tekrarlarını oluşturmak için ne kadar sürdüğünü kontrol ettim:
[email protected]() reshape(bsxfun(@times,v,ones(1,100)),[],1)
timeit(f3)
ans =
0.0374
: Ancak
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
bsxfun
daha hızlı olduğu
aşağıda, bu gözlem, daha dikkatli bir çalışma verilmiştir:
bir vektör, 1000 öğe uzunluğunda 1E5 süreleri için 10 tekrar göz önüne alındığında elde aşağıdaki performans süreleri:
Tekrarlama küçük # için
bsxfun
ve matris çarpımı arasında değil, tekrarlar arasında az bir fark vardır ~ bsxfun
kazanç açıkça 1E3, geçer. Bununla birlikte, aynı aralıktaki tekrarlarla sadece 10 elemanlık uzun bir vektörün alınması, matris çarpımının daha verimli olduğunu göstermektedir. bsxfun
başlar daha sonra 10^5 tekrarlar olmak, ama o zaman bile (gösterilmemiştir) sadece ~% 5 daha hızlı:
yüzden sonra ne konum gerçekten bağlıdır. Daha fazla tartışma Loren on the Art of MATLAB blog'da bulunur. olarak çalışmaktadır