Matlab:用于存储 { 键( 双 x, 双 y) 的数据结构:值 (z)}



我想在 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,其中列分别表示xyz。然后给定一个两列输入xy,其中列表示x,y搜索data中最近的点可以通过以下方式完成

  1. 计算dataxy之间所有距离的矩阵dist。最简单的方法是使用统计工具箱中的pdist2,它允许您指定欧氏或任何其他所需距离。或者可以手动完成;见下文。
  2. 获取从xy中的每个点到data中所有点的距离的最小参数。这是由min的第二个输出给出的。
  3. 使用它来索引到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);

相关内容

  • 没有找到相关文章

最新更新