【问题标题】:MATLAB: Splitting a matrix based on multiple valuesMATLAB:根据多个值拆分矩阵
【发布时间】:2016-05-13 01:17:47
【问题描述】:

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

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 循环,因为矩阵可能相当大,而且复杂度可能会变得非常大。

感谢您的阅读!

【问题讨论】:

  • “第一个和第二个矩阵中的值相同的子矩阵”是什么意思? M1 != M2
  • 对不起,打错了,我会改正的。
  • 您输入的数据是否已经排序,您的子矩阵是原始矩阵中的连接块?您最终会得到许多子矩阵,还是只是输入数据大是您的问题?
  • 即使第一列的值不变,第二列的值是否也总是变化,而当第一列的值发生变化时,你的第二列值是否也会发生变化?我的意思是..你能简单地从第二列告诉你什么时候取你的子矩阵吗?
  • 丹尼尔,是的。这些是连接的块,最小的块将是第一个块。 Matthias,是的,您可以从第二列中看出它们何时会改变。

标签: matlab matrix indexing


【解决方案1】:

这很容易通过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

这给出了一个包含部分矩阵的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

【讨论】:

  • @MatthiasW。谢谢! accumarray 的解决方案通常是:-)
  • 您也可以使用findgroups 代替 unique 在矩阵中查找组。 u = findgroups(M(:,1),M(:,2)); 其余部分保持不变。
  • 非常感谢!非常适合我想要的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-17
相关资源
最近更新 更多