1

我有一个接受可变参数的函数。这些参数是参数-值对,因此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,但我还需要删除它之后的元素。

4

2 回答 2

3

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

idx  = strcmp(str_to_find, varargin);

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

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

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

假设 idx 是一个行数组。

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

于 2012-08-14T18:18:31.090 回答
0

试试这个怎么样:

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

这应该给出“参数”的索引,并向其添加一个将获得其“值”的索引

于 2014-02-09T14:17:33.637 回答