假设我有一个大小相同的数组,例如
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]
与第二个条目不匹配,因为顺序很重要。
答案 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