2016-05-11 3 views
1

У меня есть матрица столбцов и массив ячеек, который имеет два столбца. В первом столбце есть 1x2 удвоения, а во втором столбце - 1x1.Элементы поиска матрицы в другой ячейке в matlab

Например

columnMatrix = [1;5]; 
cellArray = {[1,8],[10];[8,1],[20];[4,6],[80];[3,5],[40];[14,16],[85];[5,10],[36]}; 

Я хотел бы искать каждый элемент columnMatrix в cellArray(:,1), а затем вернуть его соответствующее значение в cellArray(:,2)

Например выход должен быть, как это

newCell = {[1],[10,20];[5],[40,36]}; 

Я попытался использовать функцию ismember таким образом

[~,idx] = ismember(cell2mat(cellArray(:,1)),columnMatrix (: , 1)); 

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

Есть ли способ, которым эта операция может быть достигнута? Может кто-нибудь, пожалуйста, помогите?

Благодаря

+0

Каких показателей он не показывается и как они расположены? – Crowley

+0

'idx = [1,0; 0,1; 0,0; 0,2; 0,0; 2,0];' –

ответ

1

Прежде всего, конвертировать первый столбец cellArray к матрице, поэтому было бы легче искать значение. Затем перебирать columnMatrix значений (например, с помощью arrayfun, но вы можете также использовать для цикла), найдите строки, которые соответствуют (any через столбцы), и выберите соответствующие значения из второго столбца cellArray, преобразуясь в числовой массив ([cellArray{...,2}]). Наконец, добавьте columnMatrix в качестве первого столбца результирующего массива ячеек:

columnMatrix = [1;5]; cellArray = {[1,8],[10];[8,1],[20];[4,6],[80];[3,5],[40];[14,16],[85];[5,10],[36]}; 

mat = cell2mat(cellArray(:,1)); 
values = arrayfun(@(x) [cellArray{any(mat==x,2),2}], columnMatrix, 'uni', false); 
result = [num2cell(columnMatrix), values]; 
+0

Спасибо за эту операцию arrayfun. Я использовал цикл for, но хотел знать, можно ли это сделать по-другому! –

+0

Если вы не возражаете, у меня есть следующий вопрос к вашему ответу. Что делать, если первый столбец 'cellArray' не имеет одинакового размера, но имеет' 1xn' удваивает, где 'n> = 2'? В этом случае 'cell2mat' возвращает ошибку catenation! Любые предложения, пожалуйста? Благодаря! –

+1

Вам все равно нужно получить логические индексы. Поэтому вместо того, чтобы делать 'any (mat == x, 2)', вы можете, например, do 'cellfun (@ (arr) any (arr == x), cellArray (:, 1))'. Обратите внимание, что нам больше не нужен var. –

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