Есть ли октавный эквивалент функции Matlab `contains`? - PullRequest
1 голос
/ 15 января 2020

Есть ли эквивалент октавской функции MATLAB contains? Или есть ли более простое решение, чем написание моей собственной функции в Octave для воспроизведения этой функциональности? Я нахожусь в процессе перехода на Octave из MATLAB, и я использую contains во всех моих сценариях MATLAB.

Ответы [ 2 ]

6 голосов
/ 15 января 2020

Давайте придерживаться примера из документации по contains: В Octave нет строк (в двойных кавычках), представленных в MATLAB R2017a. Итак, нам нужно переключиться на простые, старые (в одинарных кавычках) массивы символов. В см. Также раздел , мы получаем ссылку на 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 не является точной заменой.

Надеюсь, это поможет!


РЕДАКТИРОВАТЬ: Используйте 'isempty' вместо @isempty в вызове cellfun, чтобы получить более быструю встроенную реализацию (см. комментарий carandraug ниже).

0 голосов
/ 15 января 2020

Я не слишком знаком с функциями 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
...