使用可变步长提取矩阵行

时间:2015-01-27 13:20:32

标签: matlab matrix matrix-indexing

让我们说像我这样的3列矩阵:

1   2   0,1 "A"
1   3   0,2 "B"
1   4   0,3 "C"
1   5   0,4
1   6   0,5
1   7   0,6
1   8   0,7
1   9   0,8
1   10  0,9
1   11  1
2   3   1,1 "A"
2   4   1,2 "B"
2   5   1,3 "C"
2   6   1,4
2   7   1,5
2   8   1,6
2   9   1,7
2   10  1,8
2   11  1,9
3   4   2   "A"
3   5   2,1 "B"
3   6   2,2 "C"
3   7   2,3
3   8   2,4
3   9   2,5
3   10  2,6
3   11  2,7
4   5   2,8 "A"
4   6   2,9 "B"
4   7   3   "C"
4   8   3,1
4   9   3,2
4   10  3,3
4   11  3,4
5   6   3,5 "A"
5   7   3,6 "B"
5   8   3,7 "C"
5   9   3,8
5   10  3,9
5   11  4
6   7   4,1 "A"
6   8   4,2 "B"
6   9   4,3 "C"
6   10  4,4
6   11  4,5
7   8   4,6 "A"
7   9   4,7 "B"
7   10  4,8 "C"
7   11  4,9
8   9   5   "A"
8   10  5,1 "B"
8   11  5,2 "C"
9   10  5,3 "A"
9   11  5,4 "B"
10  11  5,5 "A"

如何在不同的矩阵中提取标有" A"?的所有行?步骤是10,9,..,2对于标有" B"的行应该做同样的事情。然后用" C"等等。输出应为:

    1   2   0,1                 
    2   3   1,1         1   3   0,2
    3   4   2           2   4   1,2
    4   5   2,8         3   5   2,1
A = 5   6   3,5         4   6   2,9
    6   7   4,1     B = 5   7   3,6
    7   8   4,6         6   8   4,2
    8   9   5           7   9   4,7
    9   10  5,3         8   10  5,1
    10  11  5,5         9   11  5,4

注意:3列矩阵是multcompare的输出,其中前两列是11列矩阵之间的比较。

2 个答案:

答案 0 :(得分:2)

由于标有A的所有行在前两列中始终为xx+1,因此您可以使用:

A = Z(find(Z(:,1)==Z(:,2)-1),:)

对于B,差异是两个,因此,

B = Z(find(Z(:,1)==Z(:,2)-2),:)

等等,假设Z是您的初始数据。

答案 1 :(得分:2)

假设M是输入数组,您可以在[10 9 8 7 6 5 ...]的连续行ID和 cumsum之间使用衰减偏移模式A 获取M中的实际行ID。然后,使用matrix-indexing获取最终输出MAB的相应行C -

offsets = 10:-1:2 %// offsets between labels
ids = cumsum([1 offsets]) %// obtain actual row ids for A

A = M(ids,:) %// get the corresponding rows of M for A by directly using ids

%// Get the corresponding rows of M for B and C by using ids and adding 1 and 2
%// respectively as B and C are at offsets 1 and 2 with respect to A and 
%// number of such row ids are one less for B and two less for C 
B = M(ids(1:end-1)+1,:) 
C = M(ids(1:end-2)+2,:)