2011-11-08 9 views
6

मेरे पास आकार 5000,1 (मैट्रिक्स) का वाई है, जिसमें 1 और 10 के बीच पूर्णांक शामिल हैं। मैं उन इंडेक्स को 1 -10-वेक्टर में विस्तारित करना चाहता हूं। आईई, वाई में 1,2,3 है ... और मैं इसे "विस्तार" करना चाहता हूं:मैटलैब/ऑक्टेव 1-के-के प्रतिनिधित्व

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

ऐसा करने का सबसे अच्छा तरीका क्या है?

मैंने कोशिश की:

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

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

यह वैक्टर के लिए काम करता है, हालांकि:

अगर y = [2 5 7], और Y = zeros(1,10), तो Y(y) = [0 1 0 0 1 0 1 0 0 0]

+0

[बनाना संकेतक मैट्रिक्स] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/6150174/creating-indicator-matrix) – Amro

उत्तर

6
n=5 
Y = ceil(10*rand(n,1)) 
Yexp = zeros(n,10); 
Yexp(sub2ind(size(Yexp),1:n,Y')) = 1 

इसके अलावा, स्पैस का उपयोग करने पर विचार करें, जैसे: Creating Indicator Matrix

+0

हैं वहाँ ई सापेक्ष योग्यता/demsits bsxfun v। sub2ind? – Frank

+0

@ फ्रैंक: यह इंडेक्सिंग-आधारित है, मेरा समानता-तुलना करने में शामिल है ... यह देखना दिलचस्प होगा कि प्रदर्शन के संदर्भ में वे तुलना कैसे करते हैं – Amro

+0

मैंने प्रदर्शन की जांच की। Sub2ind समाधान bsxfun समाधान से थोड़ा तेज है। – cyborg

-2

मुझे लगता है कि आप का मतलब:

y = [2 5 7]; 
Y = zeros(5000,10); 
Y(:,y) = 1; 

प्रश्न संपादित करने के बाद, यह इस बजाय होना चाहिए:

y = [2,5,7,9,1,4,5,7,8,9....]; //(size (1,5000)) 
for i = 1:5000 
    Y(i,y(i)) = 1; 
end 
+0

यह पूरे वाई कॉलम को 1. – cyborg

+0

पर सेट करेगा, मैं लूप लिखने से बचना चाहता था, जो सबसे स्पष्ट समाधान है :-) – Frank

+0

प्रश्न तब तक स्पष्ट नहीं था जब तक एमरो ने इसे संपादित नहीं किया :), दूसरे व्यक्ति को स्वीकार करना सुनिश्चित करें उत्तर – Smash

6

पर विचार निम्नलिखित:

y = randi([1 10],[5 1]);  %# vector of 5 numbers in the range [1,10] 
yy = bsxfun(@eq, y, 1:10)'; %# 1-of-10 encoding 

उदाहरण:

>> y' 
ans = 
    8  8  4  7  2 
>> yy 
yy = 
    0  0  0  0  0 
    0  0  0  0  1 
    0  0  0  0  0 
    0  0  1  0  0 
    0  0  0  0  0 
    0  0  0  0  0 
    0  0  0  1  0 
    1  1  0  0  0 
    0  0  0  0  0 
    0  0  0  0  0 
+0

यही वह है जिसे मैं ढूंढ रहा हूं, दे रहा हूं या ले सकता हूं :-) धन्यवाद! – Frank

+0

@ फ्रैंक: मुझे यह भी विश्वास है कि सांख्यिकी टूलबॉक्स में कुछ हद तक समान कार्य है [DUMMYVAR] (http://www.mathworks.com/help/toolbox/stats/dummyvar.html) – Amro

2

विरल तेजी से हो सकता है और स्मृति को बचाने कर सकते हैं, एक जवाब को शामिल आंख() और अधिक सुरुचिपूर्ण यह एक पाश की तुलना में तेजी है और यह उस वर्ग

यहाँ की सप्तक व्याख्यान के दौरान पेश किया गया था के रूप में किया जाएगा 1 के लिए एक उदाहरण है 4

V = [3;2;1;4]; 
I = eye(4); 
Vk = I(V, :); 
+0

मेरे लिए क्या काम करता है आंख (के) (वी, :) जो आपके समान है लेकिन लाइनों 2 और 3 को एक पंक्ति में जोड़ता है। अधिक उपयोगी रूप से, के संभावित वर्गों की संख्या है, वास्तव में कक्षाएं नहीं, इसलिए उदाहरण के लिए यदि 10 संभव परिणाम थे जिनमें से 4 वास्तव में उपस्थित थे, तो यह अधिक सही और अधिक भरोसेमंद काम करेगा। –

0

को आप cellfun संचालन की कोशिश कर सकते हैं:

function vector = onehot(vector,decimal) 
    vector(decimal)=1; 
end 
aa=zeros(10,2); 
dec=[5,6]; 
%split into columns 
C=num2cell(aa,1); 
D=num2cell(dec,1); 
onehotmat=cellfun("onehot",C,D,"UniformOutput",false); 
output=cell2mat(onehotmat); 
संबंधित मुद्दे