6
votes

I have a m-dimensional vector of integers ranging from 1 to n. These integers are column indexes for m × n matrix.

I want to create a m × n matrix of 0s and 1s, where in m-th row there's a 1 in the column that is specified by m-th value in my vector.

Example:

% 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];

Is this possible without a for-loop?

3

3 Answers

4
votes

Of course, that's why they invented sparse matrices:

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

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

which you can convert to a full matrix if you want with full:

>> full(M)
ans =

     0     0     0     1
     1     0     0     0
     0     1     0     0
3
votes

Or without sparse matrix:

>> 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

Transposition is used because in matlab arrays are addressed by columns

3
votes

In Octave, at least as of 3.6.3, you can do this easily using broadcasting:

M = v==1:4