【问题标题】:Is there an Octave equivalent of Matlab's `contains` function?是否有 Matlab 的“包含”函数的 Octave 等价物?
【发布时间】:2020-01-15 00:14:21
【问题描述】:

在 Octave 中是否有等效于 MATLAB 的 contains 函数?或者,有没有比在 Octave 中编写自己的函数来复制此功能更简单的解决方案?我正在从 MATLAB 切换到 Octave,并在我的 MATLAB 脚本中使用contains

【问题讨论】:

    标签: matlab octave


    【解决方案1】:

    让我们继续使用 contains 上的文档中的示例:在 Octave 中,没有 MATLAB R2017a 中引入的(双引号)字符串。所以,我们需要切换到普通的、旧的(单引号)字符数组。在see also section 中,我们获得了指向strfind 的链接。我们将使用这个也在 Octave 中实现的函数来创建一个模仿contains 行为的匿名函数。此外,我们还需要 cellfun,它也可以在 Octave 中使用。请看以下代码sn -p:

    % Example adapted from https://www.mathworks.com/help/matlab/ref/contains.html
    
    % Names; char arrays ("strings") in cell array
    str = {'Mary Ann Jones', 'Paul Jay Burns', 'John Paul Smith'}
    
    % Search pattern; char array ("string")
    pattern = 'Paul';
    
    % Anonymous function mimicking contains
    contains = @(str, pattern) ~cellfun('isempty', strfind(str, pattern));
    % contains = @(str, pattern) ~cellfun(@isempty, strfind(str, pattern));
    
    TF = contains(str, pattern)
    

    输出如下:

    str =
    {
      [1,1] = Mary Ann Jones
      [1,2] = Paul Jay Burns
      [1,3] = John Paul Smith
    }
    
    TF =
      0  1  1
    

    这应该类似于 MATLAB 的 contains 的输出。

    所以,最后 - 是的,您需要自己复制功能,因为 strfind 不能完全替代。

    希望有帮助!


    编辑:cellfun 调用中使用'isempty' 而不是@isempty 以获得更快的内置实现(参见下面的carandraug's comment)。

    【讨论】:

    • 也许值得注意的是cellfun 基本上是一个循环,所以这对于大型单元阵列来说性能不是很好。我想如果 OP 给出了这很重要的具体示例(如果有的话),那么可能会有更快的定制解决方案......
    • @Wolfie 这是真的!由于我目前没有可用的 MATLAB:MATLAB 的 contains 如何在大型字符串数组上执行?是否有一些智能算法在幕后工作?还是有一些优化?从幼稚的角度来看:仍然必须有 n (子)字符串发现。那么,是否应该对此进行任何优化也适用于strfind 方法?
    • @Wolfie celfun 基本上不是针对特定情况的循环。如果不是函数处理程序@isempty 传递函数名称为isempty 的字符串,它将使用更快的实现。
    • @carandraug 啊,我忘了!将其添加到我的答案中。 (可以访问 MATLAB 的人可能会为这两个版本提供时间。)
    • @carandraug 是的,但是当我评论它时使用它基本上是一个循环,我认为我对特定用例优化的评论仍然与'isempty'一致更新。不过,这是一个很好的技巧。
    【解决方案2】:

    我对 MuPad 函数不太熟悉,但看起来这是在重新发明 ismember 函数(在 Matlab 和 Octave 中都存在)。

    例如

    ismember( {'jim', 'stan'}, {'greta', 'george', 'jim', 'jenny'} )
    % ans = 1  0
    

    'jim' 是 {'greta', 'george', 'jim', 'jenny'} 的成员,而 'stan' 不是。

    此外,ismember 还支持查找匹配元素的索引:

    [BoolVal, Idx] = ismember( {'jim', 'stan'}, {'greta', 'george', 'jim', 'jenny'} )
    % BoolVal = 1  0
    % Idx     = 3  0
    

    【讨论】:

    • ismembercontains 不一样 - 因此引入了 contains 函数。为了扩展您的示例,ismember( {'george', 'jim'}, 'eor' ) 将为两个输入元素返回 false,但 contains( {'george', 'jim'}, 'eor' )'george' 返回 true。
    • @Wolfie 谢谢。我不清楚这两者有何不同。我会留下这个,如果只是为了这个评论。
    猜你喜欢
    • 2012-07-22
    • 2019-12-15
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    相关资源
    最近更新 更多