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

时间:2018-10-16 22:33:13

标签: matlab data-structures

我想在Matlab中创建一个查找数据映射。如果我知道x和y值,它将搜索最近的(x,y)并从数据结构中获取值。

{ Key( double x, double y) : Value (z)}

x和y坐标为双精度,并且每个x y对都映射到一个值。 x和y不是整数,也不均匀分布。所以我不能使用3D数组。映射不是一个好主意,因为它是一对一的映射。

有什么建议吗?

2 个答案:

答案 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中搜索最接近的点:

  1. 计算矩阵dist,其中dataxy之间的所有距离都相等。最简单的方法是使用统计工具箱中的pdist2,该方法可让您指定欧几里得距离或任何其他所需距离。或者可以手动完成;参见下文。
  2. 获取从xy中的每个点到data中的所有点的距离的arg min。这由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

如果您没有统计工具箱,则可以使用implicit singleton expansionbsxfun手动计算平方的欧几里德距离:

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);