MATLAB Answers

Fill NaN cell with mean of eight surrounding cells in grid data in matlab

13 views (last 30 days)
Shakir Hussain
Shakir Hussain on 21 Apr 2018
Edited: Jan on 25 Apr 2018
I am trying to fill the NaN values of grid data with 8 surrounding values but could not understand, what is going wrong here in my matlab code. The data is 752*891*11 %%% (11 years precipitation of 752*891 cells).
for i = 2 : 752
for j = 2 : 891
for k = 1 : 11
if isnan(data(i,j,k)) == 1
data(i,j,k) = nanmean(nanmean(data(i-2:i+2,j-2:j+2,k-2:k+2)));
end
end
end
end
Thanks in advance for help

Accepted Answer

Jan
Jan on 21 Apr 2018
Edited: Jan on 25 Apr 2018

If you want to replace a scalar based on a 3D array, you either need 3 nanmean calls:

nanmean(nanmean(nanmean(data(i-1:i+1, j-1:j+1, k-1:k+1))))

with i-1:i+1, instead of i-2:i+2. This would be easier:

if isnan(data(i,j,k))   % "== 1" is not needed
  tmp         = data(i-1:i+1, j-1:j+1, k-1:k+1);  % 3D block
  data(i,j,k) = nanmean(tmp(:));                  % Make it a vector
end

But this is a 3x3x3 neighborhood with 27 elements, not 8. I assume you mean:

if isnan(data(i,j,k))   % "== 1" is not needed
  tmp1        = data(i-1:i+1, j, k);
  tmp2        = data(i:i, j-1:j+1, k);
  tmp3        = data(i, j, k-1:k+1);
  tmp         = [tmp1(:); tmp2(:); tmp3(:)];  % Create a vector
  data(i,j,k) = nanmean(tmp);
end

Because the center point data(i,j,k) is included 3 times, but ignored by nanmean, you have 6 neighbors now, not 8.

So please explain again, what you exactly want.

  7 Comments

Sign in to comment.

More Answers (1)

Walter Roberson
Walter Roberson on 22 Apr 2018
means = conv2(YourMatrix, [1 1 1;1 0 1;1 1 1]/8,'same') ;
mask = isnan(YourMatrix);
YourMatrix(mask) = means(mask);

No loops needed.

Note: you would need a little adjustment to handle a nan on the edge of the matrix, to calculate the means properly.

  4 Comments

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!