【问题标题】:Multiple queries (OR statements) using find使用 find 的多个查询(OR 语句)
【发布时间】:2015-08-31 09:51:37
【问题描述】:

目前要使用find 执行多个查询,我调用每个查询分别以| 分隔

index = find(strcmp(data{:,{'type'}},'A') | strcmp(data{:,{'type'}},'B') | strcmp(data{:,{'type'}},'C') | strcmp(data{:,{'type'}},'D'));

查找字段“类型”包含 A、B、C 或 D 的所有行。

data 保存在一个表中,因此使用}

是否有更简洁的方法来执行此操作而无需每次都完整指定查询?

【问题讨论】:

    标签: matlab indexing find


    【解决方案1】:

    您可以使用ismember,而不是多次使用strcmp

    index = find(ismember(data{:,{'type'}}, {'A','B','C','D'}));
    

    另一种选择(因为ismember 可能会比多次使用strcmp 慢)是排除重复代码 -

    x = data{:, {'type'}}; %# This isn't valid MATLAB but whatever...
    index = find(strcmp(x,'A') | strcmp(x,'B') | strcmp(x,'C') | strcmp(x,'D'));
    

    你也可以使用多行来提高可读性

    x = data{:, {'type'}}; %# This isn't valid MATLAB but whatever...
    index = find(strcmp(x,'A') ...
               | strcmp(x,'B') ...
               | strcmp(x,'C') ...
               | strcmp(x,'D'));
    

    【讨论】:

    • 谢谢!出于兴趣可以将ismember 扩展为跨多个字段进行搜索,而不仅仅是type
    • 我不太清楚你的意思。你能编辑你的问题,使代码是有效的、可运行的 MATLAB 吗?这样可以更轻松地为您提供帮助!
    • 我不确定 OP 中提供的代码有什么无效之处。它在我的 MATLAB 版本上运行而没有错误 - type 是包含在 data 中的字段,它使用 MATLAB 的新表数据类型。您已经回答了我的问题,但我只是想知道您的解决方案是否可以扩展为包括多个字段,即在 type 中查找 A、B、C 或 D,同时在例如 type2 中查找 6 或 7。
    • 啊,我明白了 - 我没有使用具有表数据类型的 MATLAB 版本。我假设 data 是一个元胞数组。抱歉!
    • 我想不出一个方法来通过一次调用 ismember 来做到这一点,但你可以结合两个调用 - 例如 ismember(data{:,{'type'}}, {'A','B'}) & ismember(data{:,{'type2'}}, [6,7])
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-12
    • 1970-01-01
    • 1970-01-01
    • 2019-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多