Приведение в порядок списка - PullRequest
3 голосов
/ 16 марта 2010

Я вполне уверен, что должно быть элегантное решение для этого (в MATLAB), но я просто не могу думать об этом прямо сейчас.

У меня есть список с [classIndex, start, end], и я хочу свернуть последовательные индексы классов в одну группу, например:

Это

 1     1    40
 2    46    53
 2    55    55
 2    57    64
 2    67    67
 3    68    91
 1    94   107

должно превратиться в это

 1     1    40
 2    46    67
 3    68    91
 1    94   107

Как мне это сделать?

EDIT

Не берите в голову, я думаю, я понял - это почти как решение fmarc , но правильно получает индексы

a=[  1     1    40
     2    46    53
     2    55    55
     2    57    64
     2    67    67
     3    68    91
     1    94   107];

d = diff(a(:,1));
startIdx = logical([1;d]);
endIdx   = logical([d;1]);
b = [a(startIdx,1),a(startIdx,2),a(endIdx,3)];

Ответы [ 2 ]

2 голосов
/ 16 марта 2010

Вот одно из решений:

Ad = find([1; diff(A(:,1))]~=0);
output = A(Ad,:);
output(:,3) = A([Ad(2:end)-1; Ad(end)],3);
clear Ad
1 голос
/ 16 марта 2010

Один из способов сделать это, если рассматриваемый столбец числовой: Постройте различия по id-столбцу. Последовательные идентичные элементы будут иметь ноль здесь:

diffind = diff(a(:,1)');

Используйте это для индексации вашего массива, используя логическую индексацию.

b = a([true [diffind~=0]],:);

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

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