6

我有一个m维的整数向量,范围从 1 到n。这些整数是m × n矩阵的列索引。

我想创建一个由 0 和 1 组成的m × n矩阵,其中第m行的列中有一个 1,由我的向量中的第m个值指定。

例子:

% 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 回答