在单元格中查找相应的数组

时间:2015-10-05 09:23:53

标签: matlab pattern-matching

假设我有一个大小相同的数组,例如

arr = {[1   NaN 2  ], ...
       [NaN 4   7  ], ...
       [3   4   NaN]  };

我也有一个矢量,例如

vec = [1 2 2];

如何找到与向量vec匹配的相应单元格条目。匹配意味着同一位置的条目相同,但NaN s?

除外

对于此特定向量vec,我希望返回1,因为它与第一行匹配。

另一个向量[5 4 7]将返回2

[7 7 7]不匹配的向量以及与[3 4 7]等多个条目匹配的向量应该会产生错误。

请注意,向量[3 7 4]与第二个条目不匹配,因为顺序很重要。

3 个答案:

答案 0 :(得分:1)

对于每个单元格元素,只需检查是否

all(isnan(cellElement) | cellElement == vec)

是真的,这意味着,你找到了匹配。如果将单元格转换为具有多行且每行对应一个checkMatrix的矩阵cellElement,您甚至可以通过垂直重复vec并在一个步骤中比较整个矩阵来实现循环。你必须告诉all()检查维度2而不是维度1并让find()检测所有匹配,如下所示:

find( all( ...
    isnan(checkMatrix) | checkMatrix == repmat(vec,size(checkMatrix, 1),1) ...
    , 2)); % all() along dimension 2

答案 1 :(得分:1)

看看这种基于bsxfun的方法是否适合您 -

A = vertcat(arr{:});
matching_ind = find(all(bsxfun(@eq,A,vec(:).') | isnan(A),2)) %//'
if numel(matching_ind)~=1
    error('Error ID : 42.')
else
    out = matching_ind(1);
end

答案 2 :(得分:1)

所以我想到了它并提出了这个:

matching_ind = @(x, arr) find(...
   cellfun(@(y) max(abs(not(x-y==0).*not(isnan(x-y)))),...
           arr)                   == 0);

inds = matching_ind(vec, arr);

if length(inds) ~= 1
   error('42');
end