Поиск ближайшего соседа в MATLAB - PullRequest
0 голосов
/ 02 марта 2019

В настоящее время я использую большой оператор if (который находится внутри цикла while) для поиска моего слоя в сетке модели:

if dzf < flheightcm(i,j,1);
    z_lay = 1;
elseif dzf > flheightcm(i,j,1) & dzf<flheightcm(i,j,2);
    z_lay = 2;
elseif dzf > flheightcm(i,j,2) & dzf<flheightcm(i,j,3);
    z_lay = 3;
elseif dzf > flheightcm(i,j,3) & dzf<flheightcm(i,j,4);
    z_lay = 4;
elseif dzf > flheightcm(i,j,4) & dzf<flheightcm(i,j,5);
    z_lay = 5;
elseif dzf > flheightcm(i,j,5) & dzf<flheightcm(i,j,6);
    z_lay = 6;
elseif dzf > flheightcm(i,j,6) & dzf<flheightcm(i,j,7);
    z_lay = 7;
elseif dzf > flheightcm(i,j,7) & dzf<flheightcm(i,j,8);
    z_lay = 8;
elseif dzf > flheightcm(i,j,8) & dzf<flheightcm(i,j,9);
    z_lay = 9;
elseif dzf > flheightcm(i,j,9) & dzf<flheightcm(i,j,10);
    z_lay = 10;
elseif dzf > flheightcm(i,j,10) & dzf<flheightcm(i,j,11);
    z_lay = 11;
elseif dzf > flheightcm(i,j,11) & dzf<flheightcm(i,j,12);
    z_lay = 12;
elseif dzf > flheightcm(i,j,12) & dzf<flheightcm(i,j,13);
    z_lay = 13;
elseif dzf > flheightcm(i,j,13) & dzf<flheightcm(i,j,14);
    z_lay = 14;
elseif dzf > flheightcm(i,j,14) & dzf<flheightcm(i,j,15);
    z_lay = 15;
elseif dzf > flheightcm(i,j,15) & dzf<flheightcm(i,j,16);
    z_lay = 16;
elseif dzf > flheightcm(i,j,16) & dzf<flheightcm(i,j,17);
    z_lay = 17;
elseif dzf > flheightcm(i,j,17) & dzf<flheightcm(i,j,18);
    z_lay = 18;
elseif dzf > flheightcm(i,j,18) & dzf<flheightcm(i,j,19);
    z_lay = 19;
elseif dzf > flheightcm(i,j,19) & dzf<flheightcm(i,j,20);
    z_lay = 20;
elseif dzf > flheightcm(i,j,20) & dzf<flheightcm(i,j,21); % probably not accounting for here on.
   z_lay = 21;
elseif dzf > flheightcm(i,j,21) & dzf<flheightcm(i,j,22);
    z_lay = 22;
elseif dzf > flheightcm(i,j,22) & dzf<flheightcm(i,j,23);
    z_lay = 23;
elseif dzf > flheightcm(i,j,23) & dzf<flheightcm(i,j,24);
    z_lay = 24;
elseif dzf > flheightcm(i,j,24) & dzf<flheightcm(i,j,25);
    z_lay = 25;
elseif dzf > flheightcm(i,j,25) & dzf<flheightcm(i,j,26);
    z_lay = 26;
elseif dzf > flheightcm(i,j,26) & dzf<flheightcm(i,j,27);
    z_lay = 27;
end
no2_cumsum = no2_cumsum(1) + no2_moleccm3(i, j, z_lay, 12);

Хотя этот метод работает, он довольно медленныйи я хотел бы попробовать более быстрый подход.Ниже приведен код, над которым я работаю, заменяя свой оператор if следующим:

Gz = flheight(i,j,:); % Height data
Psz = dzf; % Distance traveled from the prior point
dze = sqrt( sum( (Gz - Psz).^2, 2)); % Distance Formula
[minDist, idxMinDist] = min(dze); % Finds the minimum value of distance traveled
closest_z = Gz(idxMinDist); % Yields closest latitude ot the value given

z_o = dzf_o;
z = closest_z;
z_lay = find(flheight(i,j,:) == (z - z_o));
no2_cumsum = no2_cumsum(1) + no2_moleccm3(i, j, z_lay, 12);

Моя проблема заключается в том, что мои данные «в полете» имеют только размеры:

flheight(1:336,1:264,1:27,1:25)

, но япродолжаю получать сообщение об ошибке

 >> Date_two
 Index exceeds matrix dimensions.

 Error in Date_two (line 208)
 no2_cumsum = no2_cumsum(1) + no2_moleccm3(i, j, z_lay, 12);

Я вполне уверен, что проблема в том, что мой код продолжает перебирать высоту, начиная с высоты (i, j, 27, t) и до третьего измерения, высоты,равно 28 примерно так:

flheight(i,j,28,t)

Это означает, что z_lay становится равным 28, даже если он находится внутри цикла while, который гласит:

while dzf < flheight(i, j, 27)
end

В любом случае, я не совсем уверен, почему мойПеременная "z_lay" продолжает повторяться до 28, после того, как она должна была достигнуть конца цикла.

...