2011-11-08 117 views
6

我有一個尺寸爲5000,1(矩陣)的y,其中包含1到10之間的整數。我想將這些索引擴展爲10中的一個向量。即,y包含1,2,3 ...並且我希望它「展開」爲:Matlab /八度1-K表示

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

是療法e相對於bsxfun v。sub2ind的優點/缺點? – Frank

+0

@Frank:這是基於索引的,我的涉及到進行平等比較......看看他們在性能方面的比較會很有趣 – 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

這將設置整個y列爲1. – cyborg

+0

我想避免編寫循環,這是最明顯的解決方案:-) – Frank

+0

問題不是很清楚,直到Amro編輯它:),一定要接受其他人的回答 – 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

@Frank:我也相信統計工具箱有一個相似的功能[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

對我來說,有效的是eye(K)( V,:)這與你的類似,但將第2行和第3行壓縮成一行。更有用的是,K是可能的類的數量,而不是實際存在的類,例如,如果有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);