Matlab / Octave 1-of-K表示

时间:2011-11-08 17:04:46

标签: matlab matrix octave

我有一个大小为5000的y(矩阵),其中包含1到10之间的整数。我想将这些索引扩展为1-of-10向量。即,y包含1,2,3 ......我希望它“扩展”为:

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]

5 个答案:

答案 0 :(得分:7)

请考虑以下事项:

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

答案 1 :(得分:6)

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

另外,请考虑使用稀疏,如:Creating Indicator Matrix

答案 2 :(得分:3)

虽然稀疏可能更快并且可以节省内存,但是涉及eye()的答案会更优雅,因为它比循环更快并且是在该类的八度演讲期间引入的

以下是1到4的示例

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

答案 3 :(得分: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);

答案 4 :(得分:-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