Индексы нулевых диапазонов в матрице ноль-один - PullRequest
1 голос
/ 27 марта 2011

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

У меня есть массив 0 и 1.Что-то вроде:

A = [0,0,0,1,1,1,1,1,0,0,1,1,1,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0];

Я хочу извлечь массив признаков: [x_1, x_2, x_3, x_4, x_5, ..]

Такой, что x_1 является индексом начала первого диапазона нулей.x_2 - это индекс конца первого диапазона нулей.

x_3 - это индекс начала второго диапазона нулей.x_4 - это индекс конца второго диапазона нулей.

Для приведенного выше примера:

x_1 = 1, x_2 = 3
x_3 = 9, x_4 = 10 

и т. Д.

Конечно, я могу сделатьэто, написав простой цикл.Мне интересно, есть ли более элегантный (векторизованный) способ решения этой проблемы.Я думал о чем-то вроде префикса, но пока не повезло.

Спасибо,

Анил.

Ответы [ 3 ]

3 голосов
/ 27 марта 2011

Функция сравнения отлично подходит для такого рода вещей и довольно быстрая.

temp = diff(A);
Starts = find([A(1) == 0, temp==-1]);
Ends = find([temp == 1,A(end)==0])

Редактировать: Исправлена ​​ошибка в расчете концов, пойманная gnovice.

2 голосов
/ 27 марта 2011

Нули, которым не предшествуют другие нули: A==0 & [true A(1:(end-1))~=0]

Нули, за которыми не следуют другие нули: A==0 & [A(2:end)~=0 true]

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

1 голос
/ 28 марта 2011

Если вы хотите получить результаты в одном векторе, как вы описали выше (например, x = [x_1 x_2 x_3 x_4 x_5 ...]), то вы можете выполнить разность второго порядка с помощью функции DIFF и найти точки, превышающие 0:

x = find(diff([1 A 1],2) > 0);

EDIT:

Вышеописанное будет работать для случая, когда в каждой строке нулей есть не менее 2 нуля. Если в A у вас будут одиночные нули, вышеприведенное можно изменить так, чтобы они обрабатывались следующим образом:

diffA = diff([1 A 1],2);
[~,x] = find([diffA > 0; diffA == 2]);

В этом случае одно нулевое значение создаст повторяющиеся индексы в x (т. Е. Если A начинается с одного нуля, то x(1) и x(2) оба будут равны 1).

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