如何在单元格数组中找到匹配特定模式的特定数组?

时间:2015-04-12 10:25:21

标签: arrays matlab

我想知道特定列中包含特定数组的单元格行的索引...

示例:

C{1,1} = [1 2 3];
C{1,2} = [4 5 6];
C{2,1} = [11 12 13];
C{2,2} = [14 15 16];

当我在第1列(或) 2 中搜索[1 2 3]时,我希望将索引设为 1 ,当我搜索[14 15 16]时列 2 。我尝试使用

index = find([C{:,1}] == [1 2 3])

但没有得到。请帮忙

2 个答案:

答案 0 :(得分:2)

直接与cellfunstrfindisempty结合使用isequal

pattern = [1 2 3];

out = cellfun(@(x) ~isempty(strfind(x,pattern)),C)
%// or as suggested by Luis Mendo
out = cellfun(@(x) isequal(x,pattern),C)

ind = find(out)

如果数组中的顺序无关紧要,也可以使用以下内容  ismemberall是可能的:

out = cellfun(@(x) all(ismember(x,pattern)),C)

out =
     1     0
     0     0

ind =
     1

所有数组都具有相同的长度n吗?然后,您可以使用带有可选if条件的更多矢量化方法来查看结果是否有效。可能没有必要,这取决于您对模式输入的确定程度。

n = 3;
pos = strfind([C{:}],pattern)
ind = [];
if mod(pos,n) == 1, ind = (pos - 1)/n + 1, end

两种变体都为您提供线性索引pattern = [14 15 16];表示它会返回 4 。要获得行索引,您需要执行其他步骤:

[~,row_ind] = ind2sub(size(C),ind)

答案 1 :(得分:0)

另一种方法使用pdist2代替ismemberall来自其他答案

pattern = [1 2 3];
out = cellfun(@(x) pdist2(x,pattern)==0,C);
ind = find(out)

给出与the other answer相同的结果。