我阅读了很多有关此主题的信息,但我无法获得有关我的问题的解决方案。
首先,我有一个包含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
答案 0 :(得分:2)
我现在明白你想要什么。您从维基百科发布的链接非常有用。您正在尝试构建所谓的Esri grid。这是维基百科上的图形表示:
您给出的是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
填充此内容。我们不会总结任何东西。
根据上述说明,代码如下。