我有两个地理参考矩阵(网格化气候数据集),我想加入不同的空间范围和分辨率(即地球表面上一个像素的空间覆盖范围)。我们称他们为referenceMatrix
和targetMatrix
。矩阵可以作为geotiffs加载到MATLAB中,或者只加载矩阵,每个像素具有相应的纬度/经度网格。
我想要的是使用NaN
中的相应值填充targetMatrix
- referenceMatrix
中的像素。我可以使用for
- 循环逐个查看像素,并使用NaN
中的数据填充targetMatrix
中的referenceMatrix
基于最近的像素。我在这里描述了用于定位空间中最近像素的方法:
How to find the nearest points to given coordinates with MATLAB?
但是我需要用数千个矩阵来完成这个任务,并且for
- 循环太慢了。因此,我想使用逻辑索引,例如,
targetMatrix(isnan(targetMatrix)) = referenceMatrix(isnan(targetMatrix))
具有根据纬度和经度匹配矩阵中像素的附加功能。你们中的任何人都可以指出一个方向,根据它们的地理参考比较不同程度的矩阵吗?
下的输入数据和想要输出的示例
targetMatrix = [1, NaN, 3;
NaN, 5, 6];
referenceMatrix = [10, 20, 30, 40;
50, 60, 70, 80];
referenceLatitude = [13.3, 13.3, 13.3, 13.3;
14.1, 14.1, 14.1, 14.1];
referenceLongitude = [3.2, 4.2, 5.2, 6.2;
3.2, 4.2, 5.2, 6.2];
targetLatitude = [13.4, 13.4, 13.4;
13.9, 13.9, 13.9];
targetLongitude = [3.1, 3.6, 4.1;
3.1, 3.6, 4.1];
wantedOutput = [ 1, 10, 3;
50, 5, 6];
所需的输出包含来自targetMatrix
的原始值,其中NaN
s填充了referenceMatrix
中最近的(空格)值,即10
}和50
。
答案 0 :(得分:1)
使用isnan
查找要替换targetMatrix
的条目。将纬度/经度从度数转换为弧度,然后使用sph2cart
转换为笛卡尔坐标,以获得实际的测地距离。然后使用knnsearch
⬥从参考坐标中找到最接近相关目标坐标的点的索引。使用这些索引从referenceMatrix
中提取相关条目,并用它们替换NaN
。
nanent = isnan(targetMatrix);
[tarX, tarY] = sph2cart(targetLongitude*pi/180, targetLatitude*pi/180, 1);
[refX, refY] = sph2cart(referenceLongitude*pi/180, referenceLatitude*pi/180, 1);
tmptar = [tarY(nanent) tarX(nanent)];
tmpref = [refY(:) refX(:)];
ind = knnsearch(tmpref, tmptar);
wantedOutput = targetMatrix;
wantedOutput(nanent) = referenceMatrix(ind);
在这种情况下,在使用knnsearch
之前将纬度/经度转换为笛卡尔坐标进行了测试 ⵜ 以加速knnsearch
除此以外。
knnsearch
默认找到欧几里德距离。您也可以使用pdist2
⬥和min
而不是knnsearch
(第6行)的组合来执行此操作。即。
[~, ind] = min(pdist2(tmptar, tmpref), [], 2);
或者你可以在第6行使用desearchn
。即
ind = dsearchn(tmpref, tmptar);
但knnsearch
在这种情况下测试 ⵜ 比dsearchn
快。
⬥ knnsearch
和pdist2
需要≥R2010a才能使用Stats和ML Toolbox。如果没有,请使用dsearchn
。
ⵜ 所有测试均由OP完成。