2016-02-03 3 views
6

Я имею дело с матрицами такого формата:MATLAB: Разбиение матрицы на основе нескольких значений

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

То, что я хочу сделать, это матрицы суб экстракт, где значения в первом и втором столбце могут быть сгруппированы такие, что:

M1 = 
1 1 3 
1 1 1 

M2 = 
1 2 2 
1 2 1 
1 2 2 

M3 = 
2 1 5 
2 1 1 

... 

Я пытался трудно думать о том, как индексировать матрицу для этого и у меня есть матрица в наличии:

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

, который я мог бы использовать для индексирования. Мне было интересно, могу ли я его использовать, но я не уверен на 100%. Я не хочу использовать цикл for, так как матрицы могут быть довольно большими и порядок сложности может стать очень большим.

Благодарим за понимание!

+1

Что вы подразумеваете под «подматрицами, где значения в первой и второй матрицах одинаковы»? M1! = M2 –

+0

Извините, ошибка, я исправлю. –

+1

Являются ли данные ввода уже отсортированными таким образом, что ваши подматрицы связаны блоками в исходной матрице? Будете ли вы в конечном итоге со множеством подматриц или просто большими входными данными? – Daniel

ответ

12

Это легко сделать с unique и accumarray:

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 

Это дает cell array содержащий частичные матрицы. В вашем примере

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

Очень приятное решение! –

+0

@MatthiasW. Благодаря! Решения с 'accumarray' обычно следующие :-) –

+0

Вы также можете использовать' findgroups' вместо уникальных для поиска групп в матрице. 'u = findgroups (M (:, 1), M (:, 2));' и остальные останутся неизменными. –

Смежные вопросы