2012-05-19 28 views
5

Tôi có m vector hai chiều của các số nguyên từ 1 đến n. Các số nguyên này là chỉ mục cột cho ma trận m × n.Tạo ma trận m theo n số 0 và 1 từ vectơ có kích thước m của chỉ mục cột

Tôi muốn tạo ra một m × n ma trận của 0s và 1s, nơi ở m hàng -thứ có một 1 trong cột được chỉ định bởi m giá trị -thứ trong vector của tôi.

Ví dụ:

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

Đây có phải là có thể mà không một cho vòng lặp?

Trả lời

4

Tất nhiên, đó là lý do tại sao họ đã phát minh sparse ma trận:

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

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

mà bạn có thể chuyển đổi sang một ma trận đầy đủ nếu bạn muốn với full:

>> full(M) 
ans = 

    0  0  0  1 
    1  0  0  0 
    0  1  0  0 
3

Hoặc không ma trận thưa thớt:

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

Chuyển vị được sử dụng vì trong mảng MATLAB được giải quyết bằng các cột

3

Trong Octave, ít nhất là của 3.6.3, bạn có thể làm điều này dễ dàng sử dụng phát sóng:

M = v==1:4 
Các vấn đề liên quan