【问题标题】:Matlab - find function between matrix and cell arrayMatlab - 在矩阵和单元格数组之间查找函数
【发布时间】:2013-09-17 15:24:28
【问题描述】:

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

例如: 一个=

 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

提前致谢, L.

【问题讨论】:

  • 在第二行,2 出现了两次。我们如何知道要删除哪一列?
  • 写的不是很清楚,但我认为他首先要搜索包含 [1 2 3 1]' 的列,然后搜索包含 [4 3]' 的列,最后搜索包含 14 的列。从写作我猜他每次只想删除 1 列(但可能全部删除)。 --- 我想这个问题最难的部分是找到要删除的列。在这里您可以找到一些在矩阵中定位向量的方法:stackoverflow.com/questions/18831011/…
  • @DennisJaheruddin 但它在问题中说“逐行”......

标签: matlab matrix bsxfun


【解决方案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

【讨论】:

    猜你喜欢
    • 2017-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多