4

私は次のベクトルを持っています:

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

その値はすべて1n(この場合は3)の間にあり、さまざまなオプションを示します。

行が値に対応するサイズsize(y, 1)xの行列を作成したいと思います。ny

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

これを行う1つの方法は

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

おそらく単一の式で、これを行うためのより良い方法はありますか?
基本的に、私が必要としているのは、ブール述語を使用して行列を生成すること(i, j) => j == y(i)です。

4

6 に答える 6

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)]) 
于 2012-05-30T10:17:52.777 に答える
5

Statistics Toolbox にアクセスできる場合、このコマンド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
于 2012-05-30T12:03:31.167 に答える
2
accumarray([(1:length(y)).' y], 1)
于 2012-05-30T13:29:43.300 に答える
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から1m1 つずつ進むことを知ることです。

于 2012-05-30T10:02:14.100 に答える
1

Octave (少なくとも 3.6.3 の時点では、いつ導入されたかは不明) では、ブロードキャストを使用してこれを非常に簡単に行うことができます。それはこのように動作します:

Y = y==1:3

(y が行行列の場合、最初に転置する必要があります。代わりに Y を転置したい場合は、y==(1:3)' を使用します)

于 2013-03-16T14:18:49.103 に答える