2016-02-03 22 views
6

Tôi đang đối phó với ma trận của định dạng này:MATLAB: Chia một ma trận dựa trên nhiều giá trị

M = 
1 1 3 
1 1 1 
1 2 2 
1 2 1 
1 2 2 
2 1 5 
2 1 1 
2 2 3 
2 2 4 
2 2 2 
... 

Những gì tôi muốn làm là ma trận phụ trích nơi các giá trị trong cột đầu tiên và thứ hai có thể được nhóm ví dụ rằng:

M1 = 
1 1 3 
1 1 1 

M2 = 
1 2 2 
1 2 1 
1 2 2 

M3 = 
2 1 5 
2 1 1 

... 

tôi đã cố gắng để suy nghĩ cứng về làm thế nào để chỉ số ma trận cho điều này và tôi có một ma trận có sẵn:

I = 
1 1 
1 2 
2 1 
2 2 
... 

mà tôi có thể sử dụng để lập chỉ mục. Tôi đã tự hỏi nếu tôi có thể sử dụng nó nhưng tôi không chắc chắn 100% như thế nào. Tôi không muốn sử dụng vòng lặp for vì các ma trận có thể khá lớn và thứ tự phức tạp có thể trở nên rất lớn.

Cảm ơn bạn đã đọc!

+1

Bạn có ý nghĩa gì bởi "ma trận phụ nơi giá trị trong ma trận thứ nhất và thứ hai giống nhau"? M1! = M2 –

+0

Xin lỗi, nhập sai, tôi sẽ sửa nó. –

+1

Dữ liệu đầu vào của bạn đã được sắp xếp theo cách mà ma trận phụ của bạn được kết nối các khối trong ma trận gốc? Bạn sẽ kết thúc với nhiều ma trận phụ hay chỉ là dữ liệu đầu vào lớn mà vấn đề của bạn? – Daniel

Trả lời

12

này có thể dễ dàng thực hiện với uniqueaccumarray:

M = [ 1 1 3 
     1 1 1 
     1 2 2 
     1 2 1 
     1 2 2 
     2 1 5 
     2 1 1 
     2 2 3 
     2 2 4 
     2 2 2 ]; %// data 
[~, ~, u] = unique(M(:,1:2), 'rows'); %// unique labels of rows based on columns 1 and 2 
M_split = accumarray(u(:), (1:size(M,1)).', [], @(x){M(sort(x),:)}); %'// group rows 
                    % // based on labels 

Điều này cho phép một cell array chứa các ma trận một phần. Trong ví dụ của bạn,

M_split{1} = 
    1  1  3 
    1  1  1 
M_split{2} = 
    1  2  2 
    1  2  1 
    1  2  2 
M_split{3} = 
    2  1  5 
    2  1  1 
M_split{4} = 
    2  2  3 
    2  2  4 
    2  2  2 
+0

Giải pháp rất đẹp! –

+0

@MatthiasW. Cảm ơn! Các giải pháp với 'accumarray' thường là :-) –

+0

Bạn cũng có thể sử dụng' findgroups' thay cho duy nhất để tìm các nhóm trong ma trận. 'u = findgroups (M (:, 1), M (:, 2));' và phần còn lại sẽ vẫn giữ nguyên. –

Các vấn đề liên quan