如果我有这个矩阵:
A:
X Y Z
1 1 2
0 3 4
0 5 6
2 7 8
7 9 10
8 11 12
3 13 14
12 14 16
15 17 18
如何创建包含以下内容的新矩阵B,C,D和E
B:
0 3 4
0 5 6
C:
X Y Z
1 1 2
2 7 8
3 13 14
D:
7 9 10
8 11 12
E:
12 14 16
15 17 18
想法是构建一个循环,询问0<A<1
否1<A<5
否6<A<10
否11<A<15
。并从该条件创建新矩阵。关于如何存储循环结果的任何想法?
答案 0 :(得分:2)
我建议您使用discretize function的方法,以便根据范围将矩阵行分组到不同的类别中。这是完整的实施:
A = [
1 1 2;
0 3 4;
0 5 6;
2 7 8;
7 9 10;
8 11 12;
3 13 14;
12 14 16;
15 17 18
];
A_range = [0 1 5 10 15];
bin_idx = discretize(A(:,1),A_range);
A_split = arrayfun(@(bin) A(bin_idx == bin,:),1:(numel(A_range) - 1),'UniformOutput',false);
celldisp(A_split);
由于您要根据第一列值考虑5
个不同的范围,因此传递给discretize
的参数必须是第一个矩阵列和包含组限制的向量(包含左边的第一个数字,第二个数字专有权,第二个数字包括左,第三个数字专有权,等等......)。由于您的范围有点混乱,请随意调整它们以尊重正确的输出。后者以双矩阵的单元格数组的形式返回,其中每个元素都包含属于不同组的行:
A_split{1} =
0 3 4
0 5 6
A_split{2} =
1 1 2
2 7 8
3 13 14
A_split{3} =
7 9 10
8 11 12
A_split{4} =
12 14 16
15 17 18
答案 1 :(得分:1)
使用logical indexing来实现您想要的效果,而不是使用循环。使用A
的第一列并检查您要查找的范围,然后使用它来分组到最终矩阵A
以获得您想要的内容。
例如,要创建矩阵C
,请在A
的第一列中找到1到5之间的所有位置,然后使用以下位置沿着行对矩阵进行子集化:
m = A(:,1) >= 1 & A(:,1) <= 5;
C = A(m,:);
您可以以类似的方式对要创建的其余矩阵重复此操作。