如何构建Esri网格?

时间:2015-02-27 15:34:25

标签: matlab matrix

我阅读了很多有关此主题的信息,但我无法获得有关我的问题的解决方案。

首先,我有一个包含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

1 个答案:

答案 0 :(得分:2)

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

enter image description here

您给出的是N×3矩阵,其中第一列表示该矩阵的行ID,第二行表示该矩阵的列ID,第三列表示每对ID的值。例如,给定上面的示例 - 特别是在图的右侧,您的文本文件可能如下所示:

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

每一行由行索引,列索引和映射到网格中此位置的值组成。你有正确的方法,你应该使用unique - 特别是第三个输出。我们需要独立获取数据前两列的唯一ID。一旦我们这样做,我将向您展示非常强大的accumarray功能。我们基本上将使用上一步中找到的唯一ID,并使用这些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的值,但我将假设您的文本文件中的值都是唯一的,只有< strong>一个值映射到每个行和列索引。因此,我们当然可以使用默认行为,因此您可以为此行为指定[](第四个输入)。因此,我们将使用矩阵的最后一列作为放入此矩阵的值,使用[]输入允许accumarray推断矩阵的大小(第三个输入),然后任意没有映射到任何内容的值,我们将使用NaN填充此内容。我们不会总结任何东西。

根据上述说明,代码如下。