6

1 からnまでの範囲の整数のm次元ベクトルがあります。これらの整数は、m × n行列の列インデックスです。

0 と 1 のm × n行列を作成したいと考えています。ここで、 m番目の行には、 m番目の値で指定された列に 1 があります。

例:

% my vector (3-dimensional, values from 1 to 4):
v = [4;
     1;
     2];

% corresponding 3 × 4 matrix
M = [0 0 0 1;
     1 0 0 0;
     0 1 0 0];

これは for ループなしで可能ですか?

4

3 に答える 3

4

もちろん、それが疎行列を発明した理由です。

>> M = sparse(1:length(v),v,ones(length(v),1))
M =

   (2,1)        1
   (3,2)        1
   (1,4)        1

fullを使用したい場合は、これを完全な行列に変換できます:

>> full(M)
ans =

     0     0     0     1
     1     0     0     0
     0     1     0     0
于 2012-05-19T12:41:19.733 に答える
3

または疎行列なし:

>> M = zeros(max(v),length(v));
>> M(v'+[0:size(M,2)-1]*size(M,1)) = 1;
>> M = M'

M =

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

matlab 配列では列によってアドレス指定されるため、転置が使用されます。

于 2012-05-19T13:56:53.340 に答える
3

Octave では、少なくとも 3.6.3 では、ブロードキャストを使用してこれを簡単に行うことができます。

M = v==1:4
于 2013-03-16T14:23:51.507 に答える