2016-06-14 10 views
1

yは、整数値を持つ列ベクトルで、ラベル番号(たとえば1-3の間)を表します。 今度はyという同じ行数の行列を作成する必要があります。各行iは、y(i)配置要素が1、その他が0となるベクトルになりました。特定の列に1を含む行列を作成する

例:

y = [3, 2, 2]'; 

x = [0,0,1; 
    0,1,0; 
    0,1,0]; 

この仕事を完了するために効率的な方法があります。私は、forループ行います知っている:

x = zeros(size(y, 1), 3) 
for i = 1:size(y, 1) 
    x(i, y(i)) = 1 
end 
+0

はここで正確な複製です:http://stackoverflow.com/questions/23078287/create-a-zeros-filled-2d-array-with-ones-at-positions-indexed-by-a-vector – Divakar

+0

@Divakar Wowは前にそれを見たことがなかった。私はそこに '希薄な '解決策が好きです。非常に賢い。 – Suever

+0

ええ、それが判明したように、我々はこの特定の問題に関して一連のダブプを持っていました。私が正しく覚えていれば、そのスパースが最も効率的でした。 – Divakar

答えて

3

あなたが簡単に線形インデックスへの添字に変換sub2indでこれを行うことができます。行のサブスクリプトは1:numel(y)、カラムの添字はyの値です。

x = zeros(numel(y), max(y)); 
x(sub2ind(size(x), 1:numel(y), y(:).')) = 1; 

または、これは単純に小さなインデックスの計算で行うことができます。

x = zeros(numel(y), max(y)); 
x(((y(:).' - 1) * numel(y)) + (1:numel(y))) = 1; 
+0

ありがとう、それは私が必要なものです。 –

関連する問題