【问题标题】:Matlab - Return only the rows of a matrix 'A' that not contain some values of matrix 'B'Matlab - 仅返回矩阵“A”中不包含矩阵“B”某些值的行
【发布时间】:2014-01-09 15:25:15
【问题描述】:

如何只返回矩阵'A'中不包含某些值的行(这些值是数组'B')?

  A = {'A1',  5  'P01,P02,P03,P04,P07'; 
        'A2'  7,  'P07,P10';
        'A3'  8,  'P07,P09';
        'A4'  8,  'P10,P11'};

    B = { 'P07'; 'P10'; 'P11'};

我只需要返回:

'A1'  ( P01,P02,P03,P04 not exist in B)
'A3'  (P09 not exist in B)

提前感谢您的帮助

【问题讨论】:

  • 直接用for loop 遍历元胞数组A 的行,然后用strcmp 检查第三个元素是否包含B 的任何值;如果不是这样,则返回每行的第一个元素...
  • @Trilarion。好计划,但 strcmp 行不通
  • 有没有没有循环的方法来获得更好的性能?
  • @疯狂物理学家。你是对的。 strfind 和 B 上的第二个循环与早期突破就可以解决问题
  • @TimmelsNear。你确定你需要更好的性能吗?为了获得更好的性能,我会先用一些数字(如 2 的幂)替换 PXX 文字,然后再进行位运算。

标签: matlab


【解决方案1】:

由于您正在处理形状怪异的单元数组和一些奇怪的字符串操作,我不知道如何用一个语句干净地解决这个问题。您可以尝试以下循环:

R = {};
for i = 1 : size(A, 1)
    test = strsplit(A{i, 3}, ',');
    for j = 1 : length(test)
        if nnz(strcmp(B, test{j})) == 0
            R = [R; A(i, 1)];
            break;
        end
    end
end

结果是:

R = 

    'A1'
    'A3'

当然,如果可以仅使用实际矩阵中每个搜索字符串的数字分量而不是字符串元胞数组,这些计算可以更快。

【讨论】:

  • @TimeIsNear。固定的。我误解了你的情况
  • 感谢您的帮助。小问题为什么要使用“nnz”?
  • @TimeIsNear nnz 计算数组中非零元素的数量。这相当于在logical 上使用sum。在这种情况下,我用它来检查strcmpB 的任何单元格中都没有找到匹配项。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-20
  • 2012-11-03
  • 1970-01-01
相关资源
最近更新 更多