Matlab - 查找矩阵和单元格数组之间的函数

时间:2013-09-17 15:24:28

标签: matlab matrix bsxfun

我有一个矩阵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

B =

 1 
 2     4
 3     3    14
 1

获取:

C =

 10
 2
 5
 10

提前致谢, 升。

1 个答案:

答案 0 :(得分: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作为将其余元素归零的奇特方式。
  4. 对于您的示例,它看起来像这样:

    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