2014-10-27 2 views
1

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

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

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

код я теперь выглядит так

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

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

Что-то вроде

slice{i}(idx, start:finish) 

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

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

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

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

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

, а затем просто возвращаемся к макету.

+2

В начале вы можете использовать cell2mat преобразовать в числовой массив? С этим легче работать. –

+0

Согласитесь с Benoit на этом. Итак, любая конкретная причина наличия массива ячеек для хранения таких данных? – Divakar

+0

Отсутствие причины - просто было проще работать срез с помощью среза в массиве ячеек. Я посмотрю, легче ли это с числовым, я просто подумал, что мне не хватает простого кода кода – browser

ответ

0

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

%// 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; 
+0

Ошибка использования накопителя Первый вход SUBS должен содержать положительные целые индексы. Ошибка в stackhelp (строка 5) max_row_ind = accumarray (slicenum (:, 1), slicenum (:, 2), [], @ max_ind) + offset1 – browser

+0

@browser Итак, у вас есть координаты X как '0''s слишком? – Divakar

+0

вокруг 0, x шагов от -0.111 до 0.089, Тем не менее, мне нужен код, который также обрабатывал бы сценарий, если бы были 0s – browser

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