在Matlab中查找表中上一行的索引

Pra*_*els 2 matlab

如果我在Matlab中有下表:

T = table(['KAT';'MAT';'PAT';'SAT';'RAT'],[38;43;38;40;49],[71;69;64;67;64],[176;163;131;133;119])


T =

  5×4 table

    Var1    Var2    Var3    Var4
    ____    ____    ____    ____

    KAT      38      71     176 
    MAT      43      69     163 
    PAT      38      64     131 
    SAT      40      67     133 
    RAT      49      64     119
Run Code Online (Sandbox Code Playgroud)

我如何参考PAT上方的整行.

例如,下面的代码找到与PAT匹配的行

>> T((ismember(T.Var1,'PAT','rows')),:)

ans =

  1×4 table

    Var1    Var2    Var3    Var4
    ____    ____    ____    ____

    PAT      38      64     131 
Run Code Online (Sandbox Code Playgroud)

但是当我在索引中扣除1以找到'PAT'匹配行上方的行时,我得到以下错误:

>> T((ismember(T.Var1,'PAT','rows')-1),:)
Index in position 1 is invalid. Array
indices must be positive integers or logical
values.
Run Code Online (Sandbox Code Playgroud)

有没有什么办法可以找到上面那行匹配'PAT'的行?

Mat*_*att 5

你的输出ismember是一个向量[0 0 1 0 0]'.如果从中得到[-1 -1 0 -1 -1]'一个不是有效索引的那个.一个简单的解决方案是使用find然后减去1.

T((find(ismember(T.Var1, 'PAT', 'rows'))-1), :)

ans = 

    Var1    Var2    Var3    Var4

    ____    ____    ____    ____

    MAT     43      69      163 
Run Code Online (Sandbox Code Playgroud)

find 返回非零元素的索引.

另一种选择是用于circshift移动向量中的元素.

T(circshift(ismember(T.Var1, 'PAT', 'rows'),-1), :)

ans = 

    Var1    Var2    Var3    Var4
    ____    ____    ____    ____

    MAT     43      69      163 
Run Code Online (Sandbox Code Playgroud)