我想在Matlab中创建一个查找数据映射。如果我知道x和y值,它将搜索最近的(x,y)并从数据结构中获取值。
{ Key( double x, double y) : Value (z)}
x和y坐标为双精度,并且每个x y对都映射到一个值。 x和y不是整数,也不均匀分布。所以我不能使用3D数组。映射不是一个好主意,因为它是一对一的映射。
有什么建议吗?
答案 0 :(得分:3)
您可以使用scatteredInterpolant
。使用@LuisMendo answer中包含的示例:
dataxy = [ 1 2
1.5 1.1
3.2 1.9
-0.3 -3.4
4.2 2.1];
dataz = [ 10
90
40
-60
50];
xy = [2.4 3;
6.5 1.8];
F = scatteredInterpolant(dataxy, dataz, 'nearest');
result = F(xy);
这里F
可被视为查找数据映射。
答案 1 :(得分:2)
这是一种手动方法。最好使用@rahnema1's answer。
您可以使用三列矩阵data
,其中各列分别表示 x , y 和 z 。然后给定两列输入xy
,其中各列代表 x , y ,可以通过以下方法在data
中搜索最接近的点:
dist
,其中data
与xy
之间的所有距离都相等。最简单的方法是使用统计工具箱中的pdist2
,该方法可让您指定欧几里得距离或任何其他所需距离。或者可以手动完成;参见下文。xy
中的每个点到data
中的所有点的距离的arg min。这由min
的第二个输出给出。data
矩阵中。
data = [ 1 2 10;
1.5 1.1 90;
3.2 1.9 40;
-0.3 -3.4 -60;
4.2 2.1 50];
xy = [2.4 3;
6.5 1.8];
dist = pdist2(data(:,[1 2]), xy, 'euclidean');
[~, ind] = min(dist, [], 1);
result = data(ind,3);
给予
result =
40
50
如果您没有统计工具箱,则可以使用implicit singleton expansion或bsxfun
手动计算平方的欧几里德距离:
dist = sum((permute(data(:,[1 2]), [1 3 2])-permute(xy, [3 1 2])).^2, 3);
或
dist = sum((bsxfun(@minus, permute(data(:,[1 2]), [1 3 2]), permute(xy, [3 1 2]))).^2, 3);