0

我有一个矩阵 A = (4*4) 和一个元胞数组 B {4,1}。我想在 A 中找到 B 的所有值,逐行搜索,然后我想删除与该特定值关联的对应列。我在使用 bsxfun o cellfun 并使用矩阵和元胞数组查找函数时遇到问题。我试图将单元格数组转换为矩阵,但我没有更多的确切对应关系。

例如:A =

 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

在此先感谢,L。

4

1 回答 1

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
于 2013-09-17T16:12:31.923 回答