在matlab中为不同区域分配值

计算科学 matlab
2021-12-19 05:33:32

我面临一个问题如下:我已经创建了一个Voronoi图,现在我想为每个区域分配一个值,即我想扩展这个Voronoi图以在Matlab中形成一个2变量函数。例如,让其中一个单元格命名为R1,我希望我要分配一个常量值的 2 变量函数(例如,f(x,y)=4) 到所有点R1. 对于其他单元格也是如此。

编辑:我在此处包含有关如何存储 Voronoi 图的信息。我正在使用的是voronoin函数,它返回多边形和单元格的顶点以及它们组成的相应顶点。此外,由于 Voronoi 图中划分的边是直线,因此可以追踪单元格。

1个回答

您可以使用griddata带有'nearest'选项的功能来完成此操作。为了在多次调用您的函数时获得更好的性能,请使用 kd-tree 最近邻搜索。

要使用该griddata方法,只需F为单元定义一组值,并使用确定 Voronoi 图的点X, Y进行最近邻插值。为此,您显然需要知道定义 Voronoi 图的点。我猜你有这些观点,因为你说你正在使用该voronoin函数来生成 Voronoi 图。您可以将函数定义为f = @(x_in,y_in) griddata(X,Y,F,x_in,y_in,'nearest');,然后将其称为f(x,y).

如果您需要对函数的许多单独调用执行此操作,那么定义搜索树然后重新使用它会更快。如果您有统计工具箱,您可以使用 KD Trees 执行此操作,如下所示

clear
X=rand(15,1);
Y=rand(15,1);
kdtree = KDTreeSearcher([X(:),Y(:)]);
F(:,1)=(1:15);
f = @(x_in,y_in) F( kdtree.knnsearch([x_in(:),y_in(:)]) );
x=rand(1000,1);
y=rand(1000,1);
fvals = f(x,y);
figure(1)
clf
hold on
voronoi(X,Y,'kx')
scatter(x,y,100,fvals,'.')

带有 Voronoi 单元的散点图


注意:
我认为任何显式搜索哪个多边形 Voronoi 单元格包含一个点的解决方案都会比这种方法慢得多。如果您不知道确定 Voronoi 图的点,则可以从单元格中确定它们。