如何构建 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
填充。我们不会总结任何东西。
有了上面的解释,代码如下。
我阅读了很多关于这个主题的信息,但我无法获得解决我的问题的方法。
首先,我有一个包含 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
填充。我们不会总结任何东西。
有了上面的解释,代码如下。