2016-02-22 28 views
6

Y = zeros(5000,10); y, 1'den 10'a kadar sayılardan oluşan 5000 x 1 önceden tanımlanmış bir vektördür; Benim kodun kalan vektörleşen ve döngü hiçbirini içermiyor beri Bu MATLAB kodunu uygulamak için daha iyi bir yolu var mı?

for i= 1:size(Y,1) 
    Y(i,y(i)) = 1; 
end 

bu uygulamak için daha iyi ve daha basit bir yolu var mı

+2

Bu kod oldukça hızlı olduğu gibi muhtemelen, içinde gerçekten küçük şeyler yapıyorlar çünkü. –

cevap

6

Şunları kullanabilirsiniz bsxfun:

bsxfun(@eq,y,[1:10]) 

yerine Kodunuzu, y(i)==[1:10] kullanarak her satırı oluşturarak nihayet vektörize etmek için bsxfun'a sarılırsınız.

başka bir fikir olacağını endeks hesaplama:

Y((y-1).*5000+(1:5000).')=1; 
+2

Nice catch @Daniel. Ancak, döndürülen matris, 'zeros() 'ile önbelleğe alsanız bile mantıklı görünmektedir. Bir "double()" dönüşümü gerekli olabilir. – Alessiox

+0

Ve benim sistemimde bu "for" döngüsünden çok daha yavaş ... (dönüşüm ile) – zeeMonkeez

+0

bana, "double()" dönüşümü dahil olmak üzere, bsxfun() 'dır, 'for' döngüsü (0.002190s vs 0.005001s) – Alessiox

2

Şunları kullanabilirsiniz sub2ind: Ancak

Y(sub2ind(size(Y), 1:size(Y, 1), y')) = 1; 

, bu aslında biraz daha yavaş olabilir: Burada

Y = zeros(5000,10); 
y = randi(10, 5000, 1); 

tic 
for jj = 1:1000 
    for i = 1:size(Y,1) 
     Y(i,y(i)) = 1; 
    end 
end 
toc 
% Elapsed time is 0.126774 seconds. 

tic 
for jj = 1:1000 
    Y(sub2ind(size(Y), 1:size(Y, 1), y')) = 1; 
end 
toc 
% Elapsed time is 0.139531 seconds. 

% @Daniel's solution 
tic 
for jj = 1:1000 
    Y = double(bsxfun(@eq, y, 1:10)); 
end 
toc 
%Elapsed time is 0.187331 seconds. 
2

başka yaklaşım:kullanarak bir sparse matrisi oluşturun Gerekirsesütun indisleri olarak ve sonra full dönüştürmek:

Y = full(sparse(1:numel(y), y, 1, numel(y), 10)); 
İlgili konular