2016-02-22 6 views
6

Y = zeros(5000,10); y एक 5000 x 1 पूर्वनिर्धारित वेक्टर है जिसमें 1 से 10 की संख्या शामिल है;क्या इस MATLAB कोड को लागू करने का कोई बेहतर तरीका है?

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

इस लागू करने के लिए एक बेहतर और आसान तरीका के बाद से मेरी कोड के बाकी vectorized है और पाश के लिए कुछ भी नहीं है है

+2

इस कोड को शायद काफी तेजी से यह है के रूप में है, क्योंकि तुम सच में छोटी चीज़ें अंदर कर रहे हैं। –

उत्तर

6

आप इस्तेमाल कर सकते हैं bsxfun:

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

के बजाय आपका कोड, आप y(i)==[1:10] का उपयोग करके प्रत्येक पंक्ति बना सकते हैं जिसे आखिरकार bsxfun में वेक्टरनाइज़ करने के लिए लपेटा जाता है।

एक और विचार होगा सूचकांक गणना:

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

अच्छा पकड़ @ डैनियल। हालांकि लौटा मैट्रिक्स तार्किक प्रतीत होता है, भले ही आप इसे 'शून्य() 'के साथ प्रीलोकेट करते हैं। एक 'डबल() 'रूपांतरण की आवश्यकता हो सकती है। – Alessiox

+0

और मेरे सिस्टम पर यह 'फॉर लूप' (रूपांतरण के साथ) – zeeMonkeez

+0

से धीमा है, 'डबल()' रूपांतरण सहित 'bsxfun()', के संबंध में आधा समय लगता है 'लूप के लिए (0.0021 9 0 बनाम 0.005001s) – Alessiox

2

आप इस्तेमाल कर सकते हैं sub2ind:

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

बहरहाल, यह वास्तव में थोड़ी धीमी हो सकती है:

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

यहाँ एक और तरीका है:का उपयोग कर sparse मैट्रिक्स बनाएंस्तंभ सूचकांक के रूप में, और उसके बाद full में बदलने अगर जरूरत:

Y = full(sparse(1:numel(y), y, 1, numel(y), 10)); 
संबंधित मुद्दे