Matlab:用于存储{ Key(双精度x,双精度y):Value(z)}的数据结构

4
我希望在Matlab中创建一个查找数据映射。如果我知道x和y的值,它会搜索最接近的(x,y)并从数据结构中获取值。
{ Key( double x, double y) : Value (z)}
x和y坐标是双精度浮点数,并且每个x y对都被映射到一个值。x和y不是整数,也不是均匀分布的。因此,我不能使用3D数组。映射表也不是一个好主意,因为它是一对一映射。
有什么建议吗?

R-tree 是查找空间位置最近元素的最佳数据结构。我不知道是否有 MATLAB 实现,但建议您搜索 File Exchange,可能已经有人实现了。 - Cris Luengo
2个回答

3

您可以使用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可以被看作是一个查找数据映射表。

非常感谢!能否将(z1,z2)作为一对存储在dataz中? - Di Wang
1
我认为它是:dataz = [z1 z2];F = scatteredinterpolant(dataxy, 1:size(dataz,1), 'nearest'); result = dataz(F(xy),:); - rahnema1

2

这是一种手动方法。最好使用@rahnema1的答案

您可以使用三列矩阵data,其中列分别表示xyz。然后,给定一个两列输入xy,其中列表示xy,在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);

gives

result =
    40
    50

If you don't have the Statistics Toolbox, the squared Euclidean distances can be computed manually using implicit singleton expansion or bsxfun:

dist = sum((permute(data(:,[1 2]), [1 3 2])-permute(xy, [3 1 2])).^2, 3);

or

dist = sum((bsxfun(@minus, permute(data(:,[1 2]), [1 3 2]), permute(xy, [3 1 2]))).^2, 3);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接