2013-09-17 3 views
0

У меня есть матрица A = (4 * 4) и массив ячеек B {4,1}. Я хотел бы найти все значения B в A, поиск по строкам и после того, как я хочу удалить соответствующий столбец, связанный с этим конкретным значением. У меня проблема с использованием bsxfun o cellfun и функция find с матрицей и массивом ячеек. Я попытался преобразовать массив ячеек в матрицу, но у меня больше нет точного соответствия.Matlab - найти функцию между матрицей и ячейкой

Например: А =

1  5 10 23 
2  4  2 18 
3  3  5 14 
1  9 10  4 

В =

1 
2  4 
3  3 14 
1 

Для того, чтобы получить:

C =

10 
2 
5 
10 

Спасибо заранее, Л.

+0

Во второй строке дважды появляется символ «2». Как узнать, какой столбец удалить? – Dan

+0

Непонятно написано, но я думаю, что он сначала хочет искать столбцы, содержащие [1 2 3 1] ', а затем для столбцов, содержащих [4 3]', и, наконец, для столбцов, содержащих 14. Из письма я бы предположил, что он только хочет каждый раз удалять 1 столбец (но, возможно, все из них). --- Полагаю, самая сложная часть этого вопроса - найти, какой столбец удалить. Здесь вы можете найти несколько способов найти вектор в матрице: http://stackoverflow.com/questions/18831011/general-method-to-find-submatrix-in-matlab-matrix –

+0

@DennisJaheruddin, но он говорит: «row by строка "в вопросе ... –

ответ

1

Вот как:

C = cellfun(@(x, y){sparse(1,find(ismember(x,y),numel(y)),true,1,size(A,2))}, ... 
     mat2cell(A, ones(size(A, 1), 1), size(A, 2)), B(:)); 
C = A(:, all(~vertcat(C{:}))); 

cellfun подают с двух клеточных массивов: первый содержит строки A и второй из них является B. Анонимная функция - сложная часть; он работает на паре два соответствующих строк следующим образом:

  1. Он использует ismember, чтобы проверить, какие столбцы в A содержать любого из элементов в B.
  2. Он использует find, чтобы выбрать только первые N единиц, относительно количества элементов в B.
  3. Он использует sparse как причудливый способ обнуления остальных элементов.

Для примера это будет выглядеть следующим образом:

A = [1 5 10 23; 2 4 2 18; 3 3 5 14; 1 9 10 4];   
B = {1; [2 4]; [3 3 14]; 1}; 

C = cellfun(@(x, y){sparse(1,find(ismember(x,y),numel(y)),true,1,size(A,2))}, ... 
    mat2cell(A, ones(size(A, 1), 1), size(A, 2)), B(:)); 

, который дает:

C = 
    { 
     [1 0 0 0] 
     [1 1 0 0] 
     [1 1 0 1] 
     [1 0 0 0] 
    } 

После этого, это простой вопрос логической индексации, чтобы забрать результирующие столбцы:

C = A(:, all(~vertcat(C{:}))); 

который в данном случае должен быть:

C = 
    10 
    2 
    5 
    10