我有一个采用可变参数的函数。这些参数是参数值对,因此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}
,finds2
为0 0 0 0 1 0
,index
为{{} 1}}。所以,我的解决方案做了我需要的,但它看起来很难看。我只想使用5
(即,不创建finds2
)从index
删除该元素,但我还需要删除该元素后的元素。
答案 0 :(得分:3)
你可以使用相当快的内置函数strcmp
:
idx = strcmp(str_to_find, varargin);
这将为您提供与目标匹配的所有单元格元素的索引。
然后,为了修剪这些元素,您可以使用
varargin( or(idx, [0 idx(1:end-1)]) ) = [];
假设idx是行数组。
最后,您可能还需要运行一些格式检查以确保用户没有以错误的顺序输入参数对(或者使用与参数名称匹配的参数名称),否则这种代码会表现得很奇怪
答案 1 :(得分:0)
尝试这个怎么样:
index = find(strcmp(str_to_find, varargin));
这应该给出'参数'的索引,并且向它添加一个将获得其'value'的索引