我想在 Matlab 中创建一个查找数据映射。如果我知道一个 x 和 y 值,它会搜索最近的 (x,y( 并从数据结构中获取值。
{ Key( double x, double y) : Value (z)}
x 和 y 坐标是双精度坐标,每个 x y 对都映射到一个值。x 和 y 不是整数,也不均匀分布。所以我不能使用 3D 数组。映射不是一个好主意,因为它是一对一映射。
有什么建议吗?
您可以使用scatteredInterpolant
.使用@LuisMendo答案中包含的示例:
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
可以看作是一个查找数据映射。
这是一种手动方法。最好使用@rahnema1的答案。
您可以使用三列矩阵data
,其中列分别表示x、y、z。然后给定一个两列输入xy
,其中列表示x,y,搜索data
中最近的点可以通过以下方式完成
- 计算
data
和xy
之间所有距离的矩阵dist
。最简单的方法是使用统计工具箱中的pdist2
,它允许您指定欧氏或任何其他所需距离。或者可以手动完成;见下文。 - 获取从
xy
中的每个点到data
中所有点的距离的最小参数。这是由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
如果没有统计工具箱,则可以使用隐式单例展开或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);