Effacer les filtres
Effacer les filtres

Find the Nearest Neighbor value in a Reference Grid

2 vues (au cours des 30 derniers jours)
Charlotte Findlay
Charlotte Findlay le 20 Juin 2018
Commenté : KSSV le 20 Juin 2018
I am trying to find a way to edit a loop which will allow me to assign any potential NaN values to their Nearest Neighbor within a reference grid (or domain).
My code creates 360 straight line transects away from a source location with an arc length of 1 degree, and uses the mapprofile function to pull out the range (rng) in degrees, depth (z) in metres at each latitude (lat) and longitude (lon) point. However, I noticed that for some transects there are NaN values for all outputs (lat/lon/range(rng)/depth(z)) at different points along the transects which I believe may be due to no exact/matching value existing within the reference grid at these points.
The domain consists of a grid of 2400x2800 pixels, for which each pixel has an associated latitude (lat), longitude (lon), reference matrix grid (R) and depth (Z) value. Unfortunately I cannot attach these due to their size.
Is there a way to ensure that any NaN values produced are assigned to their Nearest Neighbor values from the reference grid within the loops below?
if true
% Specify the source lat/long
sourcelat = 56.460723;
sourcelon = -5.29152;
% Create 360 transects
[endlat, endlon] = reckon(sourcelat, sourcelon, 1, 0:359, 'degrees');
% Create vectors for sourcelat/lon repeated 360 times
sourcelat = repmat(sourcelat,length(endlat),1);
sourcelon = repmat(sourcelon,length(endlon),1);
% Convert sourcelat/sourcelon to columns not rows
sourcelat = sourcelat';
sourcelon = sourcelon';
% Define the transects
plat = zeros(length(endlat),2);
plon = zeros(length(endlon),2);
% Create an array for depth values which has no specified length for
% the loop, 1 column in size
z_max = zeros(length(endlat),1);
% Loop outputs 360 values of plat/plon based on the sourcelat/sourcelon
% and endlat/endlon values defining the start and ends of the transects
% The loop then calculates the depth (z) for each range (rng) value at each lat
% and lon point
for k = 1:length(endlat)
% Calculate the transect lengths
plat(k,1:2) = [sourcelat(k) endlat(k)];
plon(k,1:2) = [sourcelon(k) endlon(k)];
% Output z_test values, rng, plat, plon
[z_test,~,~,~] = mapprofile(Z,R,plat(k,1:2),plon(k,1:2));
z_max(k)=length(z_test);
end
% Now initialise the array
z = NaN*ones(length(endlat), max(z_max));
rng = NaN*ones(length(endlat), max(z_max));
lat = NaN*ones(length(endlat), max(z_max));
lon = NaN*ones(length(endlat), max(z_max));
% Loop to calculate depth (z) for each range (rng)
for k = 1:length(endlat)
plat(k,1:2) = [sourcelat(k) endlat(k)];
plon(k,1:2) = [sourcelon(k) endlon(k)];
[z_test,~,~,~] = mapprofile(Z,R,plat(k,1:2),plon(k,1:2));
lz = length(z_test); % Calculates the length of each transect (as may vary)
[z(k, 1:lz),rng(k, 1:lz),lat(k, 1:lz),lon(k, 1:lz)] = mapprofile(Z,R,plat(k,1:2),plon(k,1:2));
end
end

Réponses (1)

KSSV
KSSV le 20 Juin 2018
To get the nearest neighbor, you may use knnsearch. Read about knnsearch.
  4 commentaires
Charlotte Findlay
Charlotte Findlay le 20 Juin 2018
Oh wait sorry I got mixed up - X would be the domain or reference grid which doesn't have any NaN values.
KSSV
KSSV le 20 Juin 2018
X should be your grid coordinates and Y should be your point for which you are seeking nearest neighbors in X.

Connectez-vous pour commenter.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by