2013-05-25 14 views
5

Vektörü tekrarlamanın en etkili yolu nedir?Matlabdaki bir vektörü tekrar etmek için en etkin yol

Şu anda repmat'un başka herhangi bir yöntemden üstün olduğu izlenimi altındayım? Yoksa bu zihniyetle korkunç derecede yanlış mıyım?

Farklı bir teknik kullanarak aynı sonucu repmat mu yapmak mümkün olabilir? Belki sıradan matris çarpımı?

Tüm ilgi ve destekleyici cevaplarınız için en büyük minnettarlığımı ifade etmek isterim!

AER

cevap

6

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

enter image description here

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ı:

enter image description here

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

0

Hayır, düz endeksleme daha halen repmat mostly is slow er, aşağıdaki gibidir:

Classis repmat: Bunun

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

indeksleme sürümü:

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

sadece aynı sonucu verir .

0

Gerçekten ne tür bir vericiye ihtiyacınız olduğuna bağlı.Örneğin kullandığınız "olanlar" (en azından benim makinede) yaklaşık 3 kat daha hızlı olduğunu söyleyecektir sonra

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

tic 
ones(3,5) 
toc 

, olanların satır olarak bir özel vektör böyle istiyorum. Hangi yöntemin daha hızlı olduğunu ölçmek için her zaman tik ve toc kullanabilirsiniz.

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

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

şimdi kedi yine 3 kat daha hızlı ama kendi bariz bir sınırlama var ... bir tane daha deneyelim. Umarım bu yardımcı olur

İlgili konular