MATLAB:根据多个值拆分矩阵

标签 matlab matrix indexing

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

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

感谢阅读!

最佳答案

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

关于MATLAB:根据多个值拆分矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35183894/

相关文章:

matlab - 使用另一个文件夹中的目标文件编译MEX文件

c - 使用无符号值对数组进行操作

matlab - 奇怪的单元阵列行为

java - 如何格式化数组,使其在打印时看起来像矩阵?

c# - access sql 创建前检查索引是否存在

Matlab:停止评估fmincon而不丢失数据

matrix - PyTorch - nn.Linear 权重的形状

input - netlogo 程序接受什么类型的输入

sql - 优化以通配符开头的 LIKE 表达式

mysql - 长时间运行的 MYSQL 查询、Frame Table 和 View with grouping