【发布时间】:2020-01-15 00:14:21
【问题描述】:
在 Octave 中是否有等效于 MATLAB 的 contains 函数?或者,有没有比在 Octave 中编写自己的函数来复制此功能更简单的解决方案?我正在从 MATLAB 切换到 Octave,并在我的 MATLAB 脚本中使用contains。
【问题讨论】:
在 Octave 中是否有等效于 MATLAB 的 contains 函数?或者,有没有比在 Octave 中编写自己的函数来复制此功能更简单的解决方案?我正在从 MATLAB 切换到 Octave,并在我的 MATLAB 脚本中使用contains。
【问题讨论】:
让我们继续使用 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 给出了这很重要的具体示例(如果有的话),那么可能会有更快的定制解决方案......
contains 如何在大型字符串数组上执行?是否有一些智能算法在幕后工作?还是有一些优化?从幼稚的角度来看:仍然必须有 n (子)字符串发现。那么,是否应该对此进行任何优化也适用于strfind 方法?
@isempty 传递函数名称为isempty 的字符串,它将使用更快的实现。
'isempty'一致更新。不过,这是一个很好的技巧。
我对 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
【讨论】:
ismember 和 contains 不一样 - 因此引入了 contains 函数。为了扩展您的示例,ismember( {'george', 'jim'}, 'eor' ) 将为两个输入元素返回 false,但 contains( {'george', 'jim'}, 'eor' ) 为 'george' 返回 true。