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

13 views (last 30 days)
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

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.

Shakir Hussain on 25 Apr 2018
Thank you jan The problem has solved

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

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.

Image Analyst on 23 Apr 2018
Just change the mask shape and elements to be whatever is wanted.