2012-05-30 33 views
4

布爾矩陣由謂詞我有以下矢量:生成行和列

y = [1; 3; 2; 3; 1]; 

所有其值是1n之間(在這種情況下,3)和表示不同的選項。

我想創建大小的矩陣size(y, 1) X n其行correpond到y值:做

1 0 0 % because y(1) = 1 
0 0 1 % because y(2) = 3 
0 1 0 % because y(3) = 2 
0 0 1 
1 0 0 

的一種方式,這將是

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

有沒有更好的辦法做到這個,也許在一個單一的表達?
基本上,我需要的是用布爾謂詞(i, j) => j == y(i)生成一個矩陣。

+0

可能的[創建指標矩陣]的副本(http://stackoverflow.com/questions/6150174/creating-indicator-matrix) – Amro

回答

7

你可以試試這個,如果a是列向量

a = [1; 3; 2; 3; 1]; 

bsxfun(@eq, a, [1:max(a)]) 

,這如果是一個行向量

a = [1; 3; 2; 3; 1]'; 

bsxfun(@eq, a', [1:max(a)]) 
+0

+1這真的很酷。我每週看到一個新的'bsxfun'強大的使用! – petrichor

+0

這是迄今爲止最優雅的解決方案!謝謝。 –

2

可以按如下方式初始化後的矩陣使用sub2ind

y = [1; 3; 2; 3; 1]; 
m = length(y); 
n = max(y); 

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

Y = 

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

這裏的關鍵是要知道的y相應行從1m一個接一個。

5

如果你有機會獲得統計工具箱,命令dummyvar不正是你需要。

>> y = [1; 3; 2; 3; 1]; 
>> dummyvar(y) 
ans = 
    1  0  0 
    0  0  1 
    0  1  0 
    0  0  1 
    1  0  0 
+0

很好! (+1) –

+0

感謝您的解決方案,從我+1。不幸的是,我並沒有在Octave中使用ST,所以我堅持H.Muster的回答。 –

2
accumarray([(1:length(y)).' y], 1) 
2

由於在Coursera論壇建議由德米特里Bouianov,這也適用:

Y = eye(num_labels)(y, :); 

該解決方案使用爲指標,從單位矩陣選擇行的y元素。

+0

我認爲這是實現結果最簡單的方法 –

1

在八度(至少3.6.3,不知道什麼時候推出),你可以使用廣播來做到這一點非常容易。它的工作原理是這樣的:

Y = y==1:3 

(如果y是行矩陣,你需要先轉它 - 如果你想有Ÿ換位代替,Y用==(1:3)「)