在MatLab细胞中找到一个弹

时间:2018-07-10 18:42:22

标签: arrays matlab cells

我目前正在使用MatLab R2014a

我有一个数组和一个单元格:

MyArray = ['AA1', 'AA2', 'AB1', 'AB2', 'Acc1', 'Acc2'];


MyCell = {'Name1AA1', 'Name2AA1', 'Name3Acc2', 'Name4AB2', 'Name5AD1};

MyArray由在整个MyCell中可重复的代码名称组成。 我想检查MyArray中的任何字符串是否在MyCell中,如果是,请将名称保存到新单元格中。

现在我有:

NewCell = {};
for i = 1:length(MyCell)
    for j = 1:length(MyArray)
        Find = strfind(MyCell(i), MyArray)
        if ~isempty(Find)
            NewCell = {NewCell; MyCell(j)}
        end
    end
end

但是,当我使用strfind时,会出现以下错误消息:

类型为'char'的输入参数的未定义函数'strfind'

如果我使用strcmp而不是strfind,则会得到MyCell中所有内容的数组,并重复MyArray中的元素数。

我的理想输出是:

NewCell1 = {'Name1AA1', 'Name2AA1'}
NewCell2 = {'Name4AB2'}
NewCell3 = {'Name3Acc2'}

即,对于MyArray中不存在的代码名称,没有新的单元格;如果MyArray中有代码名称,但MyCell中没有代码名称,则没有新单元格。

欢迎任何帮助,感谢您的宝贵时间

1 个答案:

答案 0 :(得分:1)

您可以使用正则表达式的组合来获得所需的输出。不建议您使用动态命名变量的方法,因为这种方法会导致难以调试的代码。请改用索引。

您可以阅读Matlab论坛上的this内容丰富的帖子,以了解原因。

%Your input data.
MyArray = ['AA1', 'AA2', 'AB1', 'AB2', 'Acc1', 'Acc2'];
MyCell = {'Name1AA1', 'Name2AA1', 'Name3Acc2', 'Name4AB2', 'Name5AD1'};

%Find common elements between MyArray and MyCell.
elem = cellfun(@(x) regexp(MyArray,x(end-2:end),'match'),MyCell,'un',0);

%Eliminate duplicates.
NewCell = unique([elem{:}]);

%Find elements in MyCell which end with NewCell elements and group them.
NewCell = cellfun(@(x) regexp([MyCell{:}],strcat('Name\d\w?',x),'match'),NewCell,'un',0);

%Join elements. 
NewCell{1} = {strjoin(NewCell{1},''',''')};

NewCell {1} = {'Name1AA1','Name2AA1'}

NewCell {2} = {'Name4AB2'}

NewCell {3} = {'Name3Acc2'}