有没有一个八度音程的Matlab 'contains'函数?

xv8emn3q  于 2022-11-24  发布在  Matlab
关注(0)|答案(3)|浏览(197)

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

fcg9iug3

fcg9iug31#

让我们继续使用contains文档中的示例:在八度音程中,没有(双引号)字符串。因此,我们需要切换到普通的、旧的(单引号)字符数组。在另请参阅一节中,我们得到了一个指向strfind的链接。我们将使用这个函数,它也是在Octave中实现的,来创建一个模拟contains行为的匿名函数。此外,我们还需要cellfun,这在Octave中也是可用的。请看下面的代码片段:

% 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的注解)。

cgfeq70w

cgfeq70w2#

我不太熟悉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
qgzx9mmu

qgzx9mmu3#

就我个人而言,我使用自己的实现,如果字符串str包含整个子字符串sub,则返回1:

function res = containsStr(str, sub)
res = 0;

strCharsCount = length(str);
subCharsCount = length(sub);

startCharSub = sub(1);

% loop over character of main straing
for ic = 1:strCharsCount
    currentChar = str(ic);
    % if a substring starts from current character
    if (currentChar == startCharSub)
        %fprintf('Match! %s = %s\n', currentChar, startCharSub);
        
        matchedCharsCount = 1;
        % loop over characters of substring
        for ics = 2:subCharsCount
            nextCharIndex = ic + (ics - 1);
            % if there's enough chars in the main string
            if (nextCharIndex <= strCharsCount)
                nextChar = str(nextCharIndex);
                nextCharSub = sub(ics);
                if (nextChar == nextCharSub)
                    matchedCharsCount = matchedCharsCount + 1;      
                end
            end
        end
        
        %fprintf('Matched chars = %d / %d\n', matchedCharsCount, subCharsCount);
        
        % the substring is inside the main one
        if (matchedCharsCount == subCharsCount)
            res = 1;  
        end
    end
end

结束

相关问题