Matlab 在具有不同类型元素的单元格数组中查找字符串
我有一个接受可变参数的函数。这些参数是参数值对,因此Matlab 在具有不同类型元素的单元格数组中查找字符串,matlab,cell-array,Matlab,Cell Array,我有一个接受可变参数的函数。这些参数是参数值对,因此varargin是一个单元格数组,其中每个奇数索引元素都是字符串(参数),但偶数索引元素可以是字符串、数字或字符串的单元格数组。我想在varargin中查找特定字符串的索引。我有一个可行的解决方案,但它使用了arrayfun两次;有没有更干净/更快/更有效的方法在这样的单元格数组中查找字符串?生成的索引将用于从varargin中删除该元素和以下元素。我希望尽量减少新变量的创建 str_to_find = 'paramX' finds = arr
varargin
是一个单元格数组,其中每个奇数索引元素都是字符串(参数),但偶数索引元素可以是字符串、数字或字符串的单元格数组。我想在varargin
中查找特定字符串的索引。我有一个可行的解决方案,但它使用了arrayfun
两次;有没有更干净/更快/更有效的方法在这样的单元格数组中查找字符串?生成的索引
将用于从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'}
,然后找到是[[][[1]{1x3单元格}
,finds2
是0 0 0 1 0
,索引是5
。因此,我的解决方案满足了我的需要,但它看起来很难看。我只会使用finds2
(即,不创建索引
)要从varargin
中删除该元素,我还需要删除它后面的元素。您可以使用内置函数strcmp
,该函数应该相当快:
idx = strcmp(str_to_find, varargin);
这将为所有与目标匹配的字符串单元元素提供索引
然后,为了修剪这些元素,您可以使用
varargin( or(idx, [0 idx(1:end-1)]) ) = [];
假设idx是一个行数组
最后,您可能还需要运行一些格式检查,以确保用户没有以错误的顺序输入参数对(或使用与参数名匹配的参数名),否则此类代码的行为将异常。尝试一下如何:
index = find(strcmp(str_to_find, varargin));
这应该给出'parameter'的索引,加上一个将得到其'value'的索引。它工作得很好,除了我得到的下标索引必须是实正整数或逻辑。
因为加法将idx
转换为双精度。我将索引改为逻辑(idx+[0 idx(1:end-1)])
很有效。很高兴它对您有效,@knowah!感谢您关于添加的注释…我编辑了我的答案,改为使用或
操作符。