MATLAB:基于多个值拆分矩阵

Joe*_*eth 6 indexing matlab matrix

我正在处理这种格式的矩阵:

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
...
Run Code Online (Sandbox Code Playgroud)

我想要做的是提取子矩阵,其中第一列和第二列中的值可以分组,以便:

M1 =
1    1    3
1    1    1

M2 =
1    2    2
1    2    1
1    2    2

M3 =
2    1    5
2    1    1

...
Run Code Online (Sandbox Code Playgroud)

我一直在努力思考如何为此索引矩阵,我有一个矩阵可用:

I =
1    1
1    2
2    1
2    2
...
Run Code Online (Sandbox Code Playgroud)

我可以用来索引.我想知道我是否可以使用它,但我不是百分百确定如何.我不想使用for循环,因为矩阵可能相当大并且复杂度的顺序可能变得非常大.

谢谢你的阅读!

Lui*_*ndo 12

这是很容易做到与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
Run Code Online (Sandbox Code Playgroud)

这给出了包含部分矩阵的单元阵列.在你的例子中,

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
Run Code Online (Sandbox Code Playgroud)