Найти индекс предыдущей строки в таблице в Matlab - PullRequest
0 голосов
/ 18 сентября 2018

Если у меня есть следующая таблица в 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

Как мне обратиться ко всей строке выше PAT.

Например, приведенный ниже код находит строку, соответствующую PAT

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

ans =

  1×4 table

    Var1    Var2    Var3    Var4
    ____    ____    ____    ____

    PAT      38      64     131 

Но когда я вычитаю 1 в индексе, чтобы найти строку над соответствующей строкой для 'PAT', я получаю следующую ошибку:

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

Есть ли способ, которым яможет найти строку выше для строки, которая соответствует 'PAT' ??

1 Ответ

0 голосов
/ 18 сентября 2018

Выход из вашего 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 

find возвращает индексы ненулевых элементов.

Другой вариант заключается в использовании circshift дляпереместить элементы в векторе.

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

ans = 

    Var1    Var2    Var3    Var4
    ____    ____    ____    ____

    MAT     43      69      163 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...