【问题标题】:MATLAB: Find first element of a cell array that belongs to another cell arrayMATLAB:查找属于另一个元胞数组的元胞数组的第一个元素
【发布时间】:2014-06-06 15:12:28
【问题描述】:

MATLAB 中是否有一个函数可以让我找到字符串元胞数组A 的第一个元素,该元素也属于字符串元胞数组B

我目前正在使用:

    i = find(ismember(A,B));
    string = A{i(1)};

但我想知道是否有一个函数在 A 的最后一个元素之前不计算 ismember,而是在找到第一个匹配项时停止。原因是 A 包含大约 1,800,000 个字符串,我只对找到第一个匹配项感兴趣。

如果我这样做,for 循环会更快吗:

    for j=1:length(A)
      if ismember(A{j}, B)
        string = A{j};
        break
      end
    end

??

A 中的元素数量是否会影响计算ismember 所需的时间?

谢谢。

【问题讨论】:

  • 不知道有没有这样的功能,也不明白为什么不能自己用tic/toc做时序测试。无论如何,如果 A 包含的元素比 B 多,也许 ismember(B,A) 会更快(当然只有当有匹配时)?
  • 我可以自己做时序测试,我只是问一下,以防有人已经知道。为什么ismember(B,A) 会更快?我不知道,因为我完全忽略了 ismember 内部发生的事情。谢谢!
  • 另外,如果在 A 中重复了很多字符串,也许 [C,ia,ic] = unique(A) 会有用吗?不确定它是否更快。 ://
  • A 已经是“unique
  • 关于 ismember(B,A) 我不确定,但我想当一个值被满足时搜索会停止。假设 B 只有两个值,其中一个存在于 A 中间。我猜 ismember(A,B) 需要 1,800,000*2 个搜索步骤,而 ismember(B,A) 只需要 1,800,000*1.5 个步骤。综上所述,如果 B 在 A 中有多个值,可能会走得更快。

标签: string matlab find match cell


【解决方案1】:

find 有一些可选参数,可让您仅获得前 N 个结果。我还没有证实这会导致短路评估;这取决于 MATLAB 的 JIT 编译器是否根据需要重新排序操作以执行 ismember

i = find(ismember(A,B), 1, 'first');

来自the documentation

nd = find(X, k)ind = find(X, k, 'first') 最多返回与X 的非零条目对应的第一个k 索引。 k 必须是正整数,但它可以是任何数字数据类型。

您当前的解决方法看起来既简单又保证具有所需的复杂性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-18
    • 1970-01-01
    相关资源
    最近更新 更多