2012-03-30 9 views
6

インデックスのベクトルをインデックスの列にあるものに変換する行列に変換したい。インデックスのベクトルを行列に変換する

x = [2;1;3;1]; 
m = someFunc(x,3) 
% m = 
% 
% 0 1 0 
% 1 0 0 
% 0 0 1 
% 1 0 0 
+0

可能な複製[マトリックス内の複数のポイントの値を変更するにはどうすればよいですか?](http://stackoverflow.com/questions/6850368/how-can-i-change-the-values-of-multiple-行列内のポイント) – gnovice

答えて

3

一つの方法は、SUB2IND機能を使用することです:

colN = 3; 
assert(max(x)<=colN,'Not enough columns') %# check that you have enough columns 
%# other checks that x is valid indices 

m = zeros(numel(x),colN); 
m(sub2ind(size(m),1:numel(x),x')) = 1; 
1

は、私は非常によく似た質問があったので、私は新しいものを開きたいしませんでした。私は、インデックスの行ベクトルを、インデックスの行の代わりに(列ではなく)1つの行列に変換したいと考えました。私は以前の答えを使用してそれを反転させることができたかもしれませんが、これは非常に大きな行列でこれがうまくいくと思いました。

octave> x = [2 1 3 1]; 
octave> m = setRowsToOne(x, 3) 
m = 

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

これを達成するためにsub2indを使用する方法がわかりませんでしたので、自分で計算しました。

function matrixResult = setRowsToOne(indexOfRows, minimumNumberOfRows) 
    numRows = max([indexOfRows minimumNumberOfRows]); 
    numCols = columns(indexOfRows); 
    matrixResult = zeros(numRows, numCols); 
    assert(indexOfRows > 0, 'Indices must be positive.'); 
    matrixResult(([0:numCols-1]) * numRows + indexOfRows) = 1; 
end 

x = [2 1 3 1]; 
m = setRowsToOne(x, 3) 
15

私はsub2ind関数をテストしましたが、coursera Machine Learningフォーラムで私はこの美しさを指摘しました。

m = eye(num_cols)(x,:); 

xの値に基づいて適切な列を選択するために単位行列を使用します。

0

あなたはそうのように、これは非常に簡単ですaccumarrayを使用することができます。

accumarray([ (1:length(x))', x ], 1, [4, 3]) 

1:length(x)一部は、行のものが行くその中に指定し、xどの列に。

関連する問題