Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 在具有不同类型元素的单元格数组中查找字符串_Matlab_Cell Array - Fatal编程技术网

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!感谢您关于添加的注释…我编辑了我的答案,改为使用
操作符。