2014-04-15 4 views
5

मैं निम्नलिखित MATLAB आपरेशन vectorize करने के लिए कोशिश कर रहा हूँ:एक सदिश द्वारा अनुक्रमित स्थानों पर लोगों के साथ एक शून्य से भरे 2 डी सरणी बनाएँ

अनुक्रमित के साथ एक स्तंभ वेक्टर देखते हुए, मैं साथ ही एक मैट्रिक्स चाहते कॉलम की पंक्तियों की संख्या और कॉलम की एक निश्चित संख्या। मैट्रिक्स शून्य के साथ प्रारंभ किया गया है और इसमें इंडेक्स द्वारा निर्दिष्ट स्थानों में से एक है।

y = [1; 3; 2; 1; 3]; 
m = size(y, 1); 

% For loop 
yvec = zeros(m, 3); 
for i=1:m 
    yvec(i, y(i)) = 1; 
end 

वांछित परिणाम है:

यहाँ स्क्रिप्ट का एक उदाहरण मैं पहले से ही लिखा है है

yvec = 

1  0  0 
0  0  1 
0  1  0 
1  0  0 
0  0  1 

क्या यह संभव है पाश के लिए बिना एक ही परिणाम प्राप्त करने के ? मैंने इस तरह कुछ करने की कोशिश की:

% Vectorization (?) 
yvec2 = zeros(m, 3); 
yvec2(:, y(:)) = 1; 

लेकिन यह काम नहीं करता है।

उत्तर

5

दो दृष्टिकोण आप यहां उपयोग कर सकते हैं।

दृष्टिकोण 1:

y = [1; 3; 2; 1; 3]; 
yvec = zeros(numel(y),3); 
yvec(sub2ind(size(yvec),1:numel(y),y'))=1 

दृष्टिकोण 2 (एक-लाइनर):

yvec = bsxfun(@eq, 1:3,y) 
+0

मैं विशेष रूप से दूसरा दृष्टिकोण की तरह :) – Muffo

+3

इसके अलावा यह प्रतीत होता है 'yvec' y'' की अधिकतम करने के लिए बराबर स्तंभों की संख्या है, के लिए बहुत दूसरा दृष्टिकोण आपके पास एक सामान्यीकृत संस्करण हो सकता है 'yvec = bsxfun (@eq, 1: max (y), y) '। – Divakar

+0

या, केवल ऑक्टेट में, '(1: 3) == y' जो [प्रसारण] के साथ दृष्टिकोण 2 है (https://www.gnu.org/software/octave/doc/v4.0.1/Broadcasting.html) । – ederag

4

फिर भी एक और दृष्टिकोण:

yvec = full(sparse(1:numel(y),y,1)); 
+0

मुझे मैटलैब में स्पैस प्रतिनिधित्व नहीं पता था, लेकिन यह इस मामले में वास्तव में उपयोगी लगता है! – Muffo

+1

इलस्ट्रेटिव, धन्यवाद! – KAs

0

मैं इसे इस तरह से किया था:

classes_count = 10; 
sample_count = 20; 
y = randi([1 classes_count], 1, sample_count); 

y_onehot = zeros(classes_count, size(y, 2)); 
idx = sub2ind(size(y_onehot), y, [1:size(y, 2)]); 
y_onehot(idx) = 1 
संबंधित मुद्दे