Объединить матрицы с географической привязкой в ​​MATLAB - PullRequest
0 голосов
/ 11 июня 2018

У меня есть две матрицы с географической привязкой (сетевые наборы климатических данных) с разным пространственным экстентом и разрешением (т. Е. Пространственное покрытие одним пикселем на поверхности Земли), к которому я хотел бы присоединиться.Давайте назовем их referenceMatrix и targetMatrix.Матрицы могут быть загружены в MATLAB как геотарифы или просто матрицы с соответствующими сетками широт / долгот на пиксель.

Я хочу заполнить NaN -пиксели в targetMatrix соответствующим значением из referenceMatrix.Я могу сделать это с помощью for -петля, который просматривает пиксели один за другим и заполняет NaN в targetMatrix данными из referenceMatrix на основе ближайшего пикселя.Метод, который я использую для локализации ближайшего пикселя в пространстве, описан здесь:
Как найти ближайшие точки к заданным координатам с помощью MATLAB?

Однако мне нужно сделать это стысячи матриц, а for -loop слишком медленный.Поэтому я хотел бы использовать логическое индексирование, например

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.

1 Ответ

0 голосов
/ 12 июня 2018

Найдите, какие записи targetMatrix необходимо заменить, используя isnan.Преобразуйте широту / долготу от градусов к радианам, а затем к декартовым координатам, используя sph2cart, чтобы получить фактические геодезические расстояния.Затем используйте knnsearch, чтобы найти индексы точек из опорных координат, которые являются ближайшими к соответствующим целевым координатам.Используйте эти индексы, чтобы извлечь соответствующие записи из referenceMatrix и заменить на них NaN s.

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);

или вы можете использовать desearchn в строке 6. т.е.

ind = dsearchn(tmpref, tmptar);

Но knnsearch проверено в этом случае скорость должна быть выше dsearchn.


knnsearch и pdist2 требуют ≥ R2010a со статистикой и ML Toolbox.Используйте dsearchn, если у вас его нет.
Все тесты выполняются OP .

...