2014-10-07 7 views
0

У меня есть ячейка длины n, где каждое число представляет собой числовой массив переменной длины.Фильтрация массивов на основе содержимого ячейки

например

C = { [ 1 2 3] ; [ 4 1 ] ; [ 28 5 15] } 

И 4xn числовой массив

например

A = [[ 1 2 3 4] ; [ 5 6 7 8 ] ; [ 9 10 11 12]] 

Я хотел бы, чтобы отфильтровать числовой массив A на основе содержания в клетке C.

Фильтр может возвращать все строки в A, которые имеют 28 в соответствующем элементе в C.

ans = [ 9 10 11 12 ] 

Или, фильтр может быть для возврата всех строк в А, которые имеют 1 в первом столбце C или 5 во втором столбце C.

ans = [[ 1 2 3 4] ; [ 9 10 11 12]] 

Надежда это имеет смысл ! Это корреляция векторов в ячейке с основным массивом, с которым я борюсь

ответ

4

Cellfun делает это относительно простым: создайте функцию, которая возвращает логический вектор, соответствующий вашим требованиям к фильтру (т. Е. Он отображает каждый вектор в C в один логический скаляр в зависимости от условий) и сделать это первым входом в cellfun. Ваш массив ячеек - второй вход. Результатом этого будет ваш вектор nx1 «фильтр». Затем примените это по размеру A, имеющему длину n, и используйте оператор двоеточия в другом измерении.

Первый один:

A(cellfun(@(x) ismember(28, x), C), :); 
ans = 
9 10 11 12 

Второй один:

A(cellfun(@(x) (x(1)==1) || (x(2)==5), C), :) 
ans = 
    1  2  3  4 
    9 10 11 12 
+0

Спасибо за вашу помощь! Работает отлично! – Mark

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