Использование логической индексации для определенного набора строк в MATLAB

Я хочу вернуть строки в массиве ячеек, которые соответствуют условию, которое повторяется каждые несколько (но переменных) строк. Например, если мои данные представляют собой координаты x, y, z, разделенные на i срезов, где каждый срез {i} представляет собой определенный z, у меня может быть что-то похожее на это.

1,3,10
1,4,10
1,5,10
2,3,10
2,4,10
3,1,10

Для каждого x я хочу вернуть строки, содержащие максимальное и минимальное значения y. Итак, в этом случае мне нужны строки 1, 3, 4, 5, 6.

Код, который у меня есть сейчас, выглядит так

idx = slice{i}(start:finish,2) == miny | slice{i}(start:finish,2) == maxy;
return = slice{i}(idx, :);

Но строка slice{i}(idx, :) просматривает весь массив с самого начала. Я хочу ограничить эту строку определенным подмножеством.

Что-то типа

slice{i}(idx, start:finish)

но это не работает.

Я пропустил какой-то синтаксис или мне нужно подойти к рутине по-другому? (Я знаю, что не предоставил достаточно информации для помощи в изменении подхода, но я предполагаю, что есть какой-то способ сделать это, ограничив индексы строк)

редактировать:

Я нашел обходной путь, создав

dummy = slice{i}(start:finish, :);    

а затем просто возвращаясь к фиктивной матрице.


person browser    schedule 27.10.2014    source источник
comment
Для начала вы можете использовать cell2mat для преобразования в числовой массив? С этим легче работать.   -  person Benoit_11    schedule 27.10.2014
comment
Согласен с Бенуа в этом. Итак, какая конкретная причина иметь массив ячеек для хранения таких данных?   -  person Divakar    schedule 27.10.2014
comment
Нет причин - просто стало легче работать послойно в массиве ячеек. Я посмотрю, будет ли проще с числовым, я просто подумал, что мне не хватает простого фрагмента кода.   -  person browser    schedule 27.10.2014
comment
Всегда ли сортируется первая строка, то есть X?   -  person Divakar    schedule 27.10.2014
comment
для каждого среза (z) да. Таким образом, в массиве ячеек он отсортирован в каждом фрагменте {i}. Однако теперь, глядя в числовой массив, он отсортирован для каждого идентичного z. И у меня такая же проблема с последней строкой кода... как мне ограничить ее начальной и конечной позицией в числовом массиве?   -  person browser    schedule 27.10.2014
comment
вы имеете в виду колонку, верно? x значения находятся в первом столбце   -  person browser    schedule 27.10.2014
comment
Извините, мой плохой, да, я имел в виду первый столбец для координат X. Итак, позвольте мне спросить вас, если вы сделаете что-то вроде slice_num = cell2mat(slice), это сработает?   -  person Divakar    schedule 27.10.2014
comment
Да, но я уже сохранил его как числовой массив. Проблема, с которой я сталкиваюсь при использовании обеих структур для данных, заключается в том, что индексация ограничивается поиском между индексами начала и конца вместо того, чтобы начинать с строки 1.   -  person browser    schedule 27.10.2014


Ответы (1)


Посмотрите, работает ли это для вас -

%// Convert slice to a nuemric array
slicenum = cell2mat(slice)

%// Create the offset arary to be added with the local max-min indices to
%// get the global(actual) row indices for idexing into slicenum or slice
offset1 = [0 ; find(diff(slicenum(:,1)))]

[~,~,unqX] = unique(slicenum(:,1))

%// Get local max and min row indices
max_row_ind = accumarray(unqX,slicenum(:,2),[],@max_ind) + offset1
min_row_ind = accumarray(unqX,slicenum(:,2),[],@min_ind) + offset1

%// Get global row indices and use them to index into slicenum for the output
max_y_slice = slicenum(max_row_ind,:)
min_y_slice = slicenum(min_row_ind,:)

Связанные функции -

function ix = max_ind(array1)
[~,ix] = max(array1);
return;

function ix = min_ind(array1)
[~,ix] = min(array1);
return;
person Divakar    schedule 27.10.2014
comment
Ошибка при использовании accumarray Первый входной SUBS должен содержать положительные целые индексы. Ошибка в stackhelp (строка 5) max_row_ind = accumarray(slicenum(:,1),slicenum(:,2),[],@max_ind) + offset1 - person browser; 27.10.2014
comment
@browser Так у вас тоже есть координаты X как 0? - person Divakar; 27.10.2014
comment
около 0, x шагов от -0,111 до 0,089. Однако мне понадобится код для обработки сценария, если бы были 0 - person browser; 27.10.2014
comment
Ошибка при использовании + Размеры матрицы должны быть согласованы. Ошибка в stackhelp (строка 11) max_row_ind = accumarray(unqX,slicenum(:,2),[],@max_ind) + offset1 - person browser; 27.10.2014
comment
@browser Дайте нам whos slicenum информацию? - person Divakar; 27.10.2014
comment
slicenum 5552x4 177664 двойной - person browser; 27.10.2014
comment
Я нашел обходной путь (см. редактирование в вопросе). Спасибо за все усилия, это действительно ценно. И этот код смещения очень полезен, так что спасибо за это! - person browser; 27.10.2014
comment
@browser Если вы все еще заинтересованы в решении на основе accumarray, которое должно быть быстрым решением, не могли бы вы предоставить нам информацию size(unqX). Кроме того, поскольку у вас был XYZ, я ожидал Nx3 размера для slicenum, не уверен, как он оказался массивом Nx4. Есть идеи и по этому поводу? - person Divakar; 27.10.2014
comment
размер (unqX) составляет 5552 x 1. Ах да, извините, это моя вина. Я упростил проблему, когда задавал вопрос. Это xyzI с интенсивностью в четвертом столбце. Прости за это - person browser; 28.10.2014