2011-11-08 8 views
13

मेरे पास लंबाई एन का वेक्टर वाई है। वाई (i) 1..एम. में एक पूर्णांक है। वाई को एन एक्स एम लॉजिकल मैट्रिक्स वाई में बदलने का एक आसान तरीका है, जहां y (i) j) = 1 अगर y (i) = j, लेकिन 0 अन्यथा? , एक कॉलम-वेक्टर कोवेक्टर को लॉजिकल मैट्रिक्स में कनवर्ट करें?

% If m is known (m = 3 here), you could write it out all at once 
yy = [y == 1; y== 2; y == 3]; 
yy = reshape(yy, n, 3); 

या

% if m is not known ahead of time 
yy = [ y == 1 ]; 
for i = 2:m; 
    yy = [ yy; y == i ]; 
end 
yy = reshape(yy, n, m); 
+0

मुझे एक और तरीका मिला ... सुनिश्चित नहीं है कि यह कोई बेहतर है ... लेकिन कम से कम यह एक पंक्ति पर फिट बैठता है: yy = repmat (y, 1, m) == repmat (1: m, n, 1); – notrick

+1

'bsxfun' मल्टीथ्रेडेड मैटलैब फ़ंक्शंस में से एक है। इस प्रकार यह आपके समाधान से तेज़ होने की संभावना है। – Jonas

उत्तर

9

आप इस

yy = bsxfun(@eq,y(:),[1,2,3]) 

y तब्दील हो जाता है के लिए bsxfun उपयोग कर सकते हैं (यदि आवश्यक हो): यहाँ मैं इसे कैसे कर रहा हूँ है जबकि अन्य वेक्टर एक पंक्ति वेक्टर है। bsxfun स्पष्ट रूप से एम-बाय -1 और 1-बाय-एन सरणी का विस्तार करता है ताकि परिणाम एम-बाय-एन बन जाए।

5

यदि एन * एम पर्याप्त रूप से बड़ा है (और एम स्वयं ही पर्याप्त रूप से बड़ा है), तो yy को एक स्पैर मैट्रिक्स के रूप में बनाना एक अच्छा विचार है। आपका y वेक्टर वास्तव में एक विशेष प्रकार का स्पैर मैट्रिक्स प्रारूप है, लेकिन हम इसे निम्नलिखित करके अंतर्निहित स्पैर मैट्रिक्स प्रारूप में अनुवाद कर सकते हैं।

yy = sparse(1:length(y), y, 1); 

यह आपके भंडारण को ओ (एन) में रखेगा। यदि आप बहुत सारे अनुक्रमण के लिए yy का उपयोग कर रहे हैं तो यह आपको बहुत से अनुकूल नहीं करेगा। यदि ऐसा है तो आप अपनी मूल स्पैस संरचना (यानी, y) का उपयोग करके बेहतर हैं।

+0

+1 निश्चित रूप से 'bsxfun' का उपयोग करने के लिए एक बेहतर विकल्प है। –

1

अपने विधि के लिए एक मामूली संशोधन:

% A n-dimensional vector y, with values in some range 1..m 
m = 4; 
n = 7; 
y = randi([1 m], n, 1); 

% Preallocating a n by m matrix of zeros 
nXm = zeros(n, m); 

% In each pass of this loop a single column of nXm is updated, where 
% for each column index j in nXm, if y(i) = j then nXm(i,j) = 1 
for j = 1:m; 
    nXm(:,j) = (y == j); 
end 
1
मशीन लर्निंग से Coursera पर

:

yy = eye(m)(y, :) 

यह जरूरी है कि सूची एक सीमा 1:m हो (जैसा कि ओपी कहा)। MATLAB पर परीक्षण नहीं: एक अनियमित सूची के लिए, [2 3 5] की तरह, यह

yy = eye(m)(:, [2 3 5])(y, :) 

नोट करते हैं।

+0

(लेकिन मैं अभी भी @ जोनास के रास्ते को बहुत साफ करता हूं, बहुत साफ है।) –

संबंधित मुद्दे