【问题标题】:Find string in cell array with elements of different types在具有不同类型元素的元胞数组中查找字符串
【发布时间】:2012-08-14 17:52:49
【问题描述】:

我有一个接受可变参数的函数。这些参数是参数值对,因此varargin 是一个元胞数组,其中每个奇数索引元素都是一个字符串(参数),但偶数索引元素可以是字符串、数字或字符串元胞数组。我想在varargin 中找到特定字符串的索引。我有一个可行的解决方案,但它使用了两次arrayfun;有没有更干净/更快/更有效的方法在这样的单元阵列中找到一个字符串?生成的index 将用于从varargin 中删除该元素和以下元素。我想尽量减少新变量的创建。

str_to_find = 'paramX'
finds = arrayfun(@(i) strfind(varargin{i},str_to_find), 1:length(varargin), 'UniformOutput', 0);
finds2 = arrayfun(@(i) ~iscell(finds{i}) && ~isempty(finds{i}), 1:length(finds));
index = find(finds2==1);

varargin(index)=[];
varargin(index)=[];

假设varargin{'paramA', 'valueA', 'paramB', 9, 'paramX', {'z','x','c'},那么finds[] [] [] [] [1] {1x3 cell}finds20 0 0 0 1 0index5。所以,我的解决方案可以满足我的需要,但它看起来很丑。我只会使用finds2(即不创建index)从varargin 中删除该元素,但我还需要删除它之后的元素。

【问题讨论】:

    标签: matlab cell-array


    【解决方案1】:

    您可以使用内置函数strcmp,它应该相当快:

    idx  = strcmp(str_to_find, varargin);
    

    这将为您提供与目标匹配的所有单元格元素的索引。

    然后,为了修剪这些元素,您可以使用

    varargin( or(idx, [0 idx(1:end-1)]) ) = [];
    

    假设 idx 是一个行数组。

    最后,您可能还需要运行一些格式检查,以确保用户没有以错误的顺序(或使用与参数名称匹配的参数名称)输入参数对,否则这种代码的行为会很奇怪.

    【讨论】:

    • 它工作得很好,除了我得到了Subscript indices must either be real positive integers or logicals.,因为加法将idx 转换为双打。我将索引更改为logical(idx+[0 idx(1:end-1)]),它可以工作。
    • 很高兴它对你有用,@knowah!感谢您提供有关添加的说明...我编辑了答案以改用 or 运算符。
    【解决方案2】:

    试试这个怎么样:

    index  = find(strcmp(str_to_find, varargin));
    

    这应该给出“参数”的索引,加一将得到其“值”的索引

    【讨论】:

      猜你喜欢
      • 2015-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多