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

Matlab-查找矩阵和单元阵列之间的函数,matlab,matrix,bsxfun,Matlab,Matrix,Bsxfun,我有一个矩阵a=(4*4)和一个单元数组B{4,1}。我想查找A中B的所有值,逐行搜索,然后删除与这个特定值关联的对应列。我在使用bsxfun o cellfun和带有矩阵和单元格数组的find函数时遇到问题。我试着将单元格数组转换成矩阵,但没有更精确的对应关系 例如: A= B= 获得: C= 提前感谢,, L.以下是方法: C = cellfun(@(x, y){sparse(1,find(ismember(x,y),numel(y)),true,1,size(A,2))}, ...

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

例如: A=

B=

获得:

C=

提前感谢,, L.

以下是方法:

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
。匿名函数是一个棘手的部分;它对一对对应的两行进行操作,如下所示:

  • 它使用
    ismember
    检查
    A
    中的哪些列包含
    B
    中的任何元素
  • 它使用
    find
    仅根据
    B
    中的元素数量选择前
    N
    个元素
  • 它使用
    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
    

    在第二行中,
    2
    出现两次。我们怎么知道要删除哪一列呢?写得不清楚,但我想他首先要搜索包含[1 2 3 1]”的列,然后搜索包含[4 3]”的列,最后搜索包含14的列。从文章来看,我猜他每次只想删除一列(但可能全部删除)我想这个问题最难的部分是找到要删除的列。在这里,你可以找到一些在矩阵中定位向量的方法:@DennisJaheruddin,但问题中是“逐行”。。。
    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