Сплит массив в MATLAB - PullRequest
8 голосов
/ 01 июля 2011

У меня есть массив целых чисел, и я хочу разделить этот массив, где 0 и функция, которая дает мне точки разделения.

Пример: массив: 0 0 0 1 2 4 5 6 6 0 0 0 0 0 22 4 5 6 6 0 0 0 4 4 0

Функция должна возвращать эти числа:

[ 3 10 ;14 20 ;22 25 ]

Эти числа являются индексом начала и конца ненулевых чисел.

Ответы [ 3 ]

5 голосов
/ 01 июля 2011

Вот простое векторизованное решение с использованием функций DIFF и FIND :

>> array = [0 0 0 1 2 4 5 6 6 0 0 0 0 0 22 4 5 6 6 0 0 0 4 4 0];  %# Sample array
>> edgeArray = diff([0; (array(:) ~= 0); 0]);
>> indices = [find(edgeArray > 0)-1 find(edgeArray < 0)]

indices =

     3    10
    14    20
    22    25

Приведенный выше код работает, сначала создавая массив столбцов с единицами, указывающими ненулевые элементы, заполняя этот массив нулями (в случае, если любой ненулевой промежуток простирается до краев массива), и принимая разности элементов , Это дает вектор edgeArray с 1, указывающим начало ненулевого диапазона, и -1, указывающим конец ненулевого диапазона. Затем функция FIND используется для получения индексов начала и конца.

Замечание / придирка к одной стороне: это не индексы начала и конца ненулевых промежутков, как вы говорите. Технически они являются индексами непосредственно перед началами и сразу после концов ненулевых промежутков. Вы можете на самом деле хотите вместо этого:

>> indices = [find(edgeArray > 0) find(edgeArray < 0)-1]

indices =

     4     9
    15    19
    23    24
2 голосов
/ 01 июля 2011

По теме, но с небольшим разбросом:

>>> a= [0 0 0 1 2 4 5 6 6 0 0 0 0 0 22 4 5 6 6 0 0 0 4 4 0];
>>> adjust= [0 1]';
>>> tmp= reshape(find([0 diff(a== 0)])', 2, [])
tmp =
    4   15   23
   10   20   25
>>> indices= (tmp- repmat(adjust, 1, size(tmp, 2)))'
indices =
    4    9
   15   19
   23   24

Как уже указывалось gnovice на позиционную семантику, связанную с indices, я просто добавлю, что с этим решением различные схемы могут обрабатываться очень простым способом при вычислении indices. Таким образом, по вашему запросу:

>>> adjust= [1 0]';
>>> tmp= reshape(find([0 diff(a== 0)])', 2, []);
>>> indices= (tmp- repmat(adjust, 1, size(tmp, 2)))'
indices =
    3   10
   14   20
   22   25
2 голосов
/ 01 июля 2011

Попробуйте это

a = [0 0 0 1 2 4 5 6 6 0 0 0 0 0 22 4 5 6 6 0 0 0 4 4 0];

%#Places where value was zero and then became non-zero
logicalOn = a(1:end-1)==0 & a(2:end)~=0;

%#Places where value was non-zero and then became zero
logicalOff = a(1:end-1)~=0 & a(2:end)==0;

%#Build a matrix to store the results
M = zeros(sum(logicalOn),2);

%#Indices where value was zero and then became non-zero
[~,indOn] = find(logicalOn);

%#Indices where value was non-zero and then became zero
[~,indOff] = find(logicalOff);

%#We're looking for the zero AFTER the transition happened
indOff = indOff + 1;

%#Fill the matrix with results
M(:,1) = indOn(:);
M(:,2) = indOff(:);

%#Display result
disp(M);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...