如何使用MATLAB中的条件从矩阵A创建矩阵B.

时间:2018-01-24 19:47:43

标签: matlab loops matrix

如果我有这个矩阵:

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<11<A<56<A<1011<A<15。并从该条件创建新矩阵。关于如何存储循环结果的任何想法?

2 个答案:

答案 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,:);

您可以以类似的方式对要创建的其余矩阵重复此操作。