【问题标题】:Test varargin for existence string pattern测试 varargin 是否存在字符串模式
【发布时间】:2019-09-02 08:41:59
【问题描述】:

我有一个函数,它接受varargin 和不同类型的灵活数量的输入。我想检查变量是否存在某个字符串/子字符串,例如

regexpi(varargin,'test');

这适用于varargin={'a','b'},但是如果有其他数据类型,它会失败。我怎样才能轻松(最少的代码行)获得一个逻辑矩阵来测试test 的存在?这是我想出的令人讨厌的令人费解的事情:

varargin={'a',1,'test',{2}};
logi=num2cell(zeros(size(varargin))); %logical vector 'is string present or not';
logi(cellfun(@isstr,varargin))=regexp(varargin(cellfun(@isstr,varargin)),'test'); 
%outputs a cell array where numbers > 0 represent 'string found'

【问题讨论】:

    标签: matlab validation input


    【解决方案1】:

    您可以使用isequal 进行快速修复

    bTest = cellfun( @(x) isequal( x, 'test' ), varargin );
    

    更详细的解决方案可能是使用inputParser 和许多 MATLAB 函数中存在的标准“名称-值对”语法。

    function myFunc( varargin )
        % 'option' is the name of this optional parameter
        % varargin = {'option', 'test'}; 
    
        p = inputParser();
        p.addOptional( 'option', '' ); % Optional parameter, default to empty
        p.parse( varargin{:} );
        p.Results.option % = 'test' for the example varargin
    

    【讨论】:

      【解决方案2】:

      我会使用这个,它与您的代码相似但更简单:

      varargin = {'abcd', 'efg', [1 2 3 4], {10; 20}};
      pattern = 'bc';
      result = cellfun(@(x) ischar(x) && ~isempty(regexpi(x, pattern)), varargin);
      

      注意&& 在匿名函数中的使用如何防止将测试应用于非字符参数。

      【讨论】:

      • 编辑:mmmmhhh 美丽!我的印象是匿名函数不允许&& 运算符,这开辟了很多新的可能性
      • @user2305193 很高兴你喜欢它:-)
      • 如果第一个条件 (ischar(x)) 为真,是否可以报告除布尔值之外的值?
      • 我不确定你的意思。那会有什么价值?匹配的起始位置?还是仅基于 ischarcondition 的附加布尔值?
      • 基本上我想要的是匿名函数中的 if 语句,如果 ~isempty(x),return(x)。 isempty(x) || x 真的不行
      猜你喜欢
      • 2020-07-29
      • 1970-01-01
      • 1970-01-01
      • 2012-04-25
      • 2016-02-26
      • 2013-08-05
      相关资源
      最近更新 更多