2010-03-16 4 views
3

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

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

Это

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's solution, но получает индексы право

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

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

Ad = find([1; diff(A(:,1))]~=0); 
output = A(Ad,:); 
output(:,3) = A([Ad(2:end)-1; Ad(end)],3); 
clear Ad 
+0

Да, это то, что я искал. – Jonas

1

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

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

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

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

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

+0

Спасибо! Ваше решение не имеет права «концов», но оно поставило меня на правильный путь. +1 – Jonas

Смежные вопросы