如何构建 Esri 格网?

How do I construct an Esri grid?

我阅读了很多关于这个主题的信息,但我无法获得解决我的问题的方法。

首先,我有一个包含 3 列的文件:X Y Z

在 MATLAB 中,我这样做了:

data = load('data.txt');
X = data(:,1);
Y = data(:,2);
Z = data(:,3);

这个文件是这样的:

7037    6032    3
7036    6028    5
7037    6029    4
7037    6030    3
7038    6031    6
7039    6031    2
7037    6033    7

而我想从上面的矩阵得到下面的矩阵:

5   NaN NaN NaN NaN NaN
NaN 4   3   NaN 3   7
NaN NaN NaN 6   NaN NaN
NaN NaN NaN 2   NaN NaN

规则是第一列Y(1) = min(Y),第二列Y(2) = Y(1) + 1。 第一行是X(1) = min(X)X(2) = X(1) + 1。本质上,第一列充当行索引,第二列充当列索引,对于每一对行和列,第三列被映射到该矩阵中的一个位置。因此,输出矩阵将如下所示: out(1,1)=X(1) Y(1)out(1,2) = X(1) Y(2)

一开始,我想像这样创建一个矩阵out

xr = sort(unique(X));
yr = sort(unique(Y));
a = length(xr);
b = length(yr);
out = NaN(a,b);

之后,通过循环,将这些数据放到这个 out 矩阵上,但这显然不起作用。

有关 Esri 网格的详细信息,请参阅有关它的维基百科文章。该页面中的示例网格正是我想要的。 http://en.wikipedia.org/wiki/Esri_grid

我现在明白你想要什么了。您从维基百科发布的 link 非常有用。您正在尝试构建所谓的 Esri grid。这是在维基百科上找到的图示:

给你的是一个 N x 3 矩阵,其中第一列表示该矩阵的行 ID,第二行表示该矩阵的列 ID,第三列表示每对 ID 处的值.因此,例如,给出上面的示例 - 具体看图的右侧,您的文本文件可能如下所示:

275 125 5
275 175 2
...
...
25 75 5
25 125 1

每一行都包含一个行索引、一个列索引和一个映射到网格中此位置的值。您的方法是正确的,因为您应该使用 unique - specifically the third output. We need to obtain a unique ID for the first two columns of your data independently. Once we do this, I'm going to show you the very powerful accumarray 函数。我们基本上将使用在上一步中找到的唯一 ID,我们使用这些索引到我们的网格中,并将与每对唯一的行和列 ID 对应的每个值放入该网格中。因此,您的代码非常简单:

data = load('data.txt');
%// Or you can do this for reproducing the results
%data = [7037 6032 3;
%7036 6028 5;
%7037 6029 4;
%7037 6030 3;
%7038 6031 6;
%7039 6031 2;
%7037 6033 7];

[~,~,id1] = unique(data(:,1));
[~,~,id2] = unique(data(:,2));
out = accumarray([id1 id2], data(:,3), [], [], NaN);

out 生成所需的 Esri 网格,我们得到:

out =

     5   NaN   NaN   NaN   NaN   NaN
   NaN     4     3   NaN     3     7
   NaN   NaN   NaN     6   NaN   NaN
   NaN   NaN   NaN     2   NaN   NaN

那么这是如何工作的呢? accumarray 接受要用于访问输出的行和列位置矩阵。在每个相应的行和列位置,您提供一个映射到此 bin 的值。现在,默认情况下 accumarray 求和 映射到每个 bin 的值,但我假设你的文本文件中的值都是唯一的一个 值被映射到每个行和列索引。因此,我们当然可以摆脱默认行为,因此您可以为此行为指定一个 [] (第四个输入)。因此,我们将使用矩阵的最后一列作为放入该矩阵的值,使用 [] 输入允许 accumarray 推断矩阵的大小(第三个输入),然后任何未映射到任何值的值,我们将用 NaN 填充。我们不会总结任何东西。

有了上面的解释,代码如下。