Удалите дублирующие строки в длинной таблице, используя matlab - PullRequest
0 голосов
/ 11 мая 2019

У меня есть таблица (800027x10) со столбцом 1, содержащая отметки времени, некоторые из которых идентичны, например:

0
1
2
3 data0
3 data1
4
5
6 data2
6 data3

Я хотел бы удалить двойные отметки времени, хотя они могут содержать другие данные в других столбцах.После удаления это должно выглядеть следующим образом

0
1
2
3 data0
4
5
6 data2

Я проверил количество двойных записей

for i=1:height(tablePos)-1
     timeDiff = tablePos.TimestampNs(i+1)-tablePos.TimestampNs(i);
    if timeDiff == 0
        counterTimeDiff = counterTimeDiff +1;
    end
end

Что приводит к 11319

, но когда я использую

[~,idu] = unique(tablePos(:,1),'stable');
uniquerows = tablePos(idu,:);

Я получаю таблицу только с 686837 вместо 800027-11319 = 788708.Что я делаю не так.

Таблица отсортирована по меткам времени.Также попытка

tablePos1 = tablePos
for i=1:height(tablePos)-1
     timeDiff = tablePos.TimestampNs(i+1)-tablePos.TimestampNs(i);
     if timeDiff == 0
         tablePos1(i,:) = [];
     end
end

не работает, так как это занимает вечность

Я только что понял, что есть только десятичное различие 11319 по сравнению с 113190, которое я не могу объяснить

1 Ответ

1 голос
/ 11 мая 2019

Когда два последовательных элемента совпадают, вы не должны увеличивать контрольный индекс i. Вы должны сохранить старый для следующей проверки. Здесь вы можете обновить i как i = i-1

tablePos1 = tablePos
for i=1:height(tablePos)-1
     timeDiff = tablePos.TimestampNs(i+1)-tablePos.TimestampNs(i);
     if timeDiff == 0
         tablePos1(i,:) = [];
         i = i -1;
     end
end

Это похоже на рисунок ниже

    x = [0 1 2 3 3 4 5 6 6];
    i = 1;
    while(i<length(x))

        if x(i+1) == x(i)
            x(i+1) =[];
        else
            i = i+1;
        end

     end

Результат

x = [ 0     1     2     3     4     5     6]
...