Replace NaN with next element in Multidimensional Array

  • #1
90
16
I have a a multidimensional array (49x49x49) which has NaN values scattered randomly.

For each NaN, I want to replace the value with the previous non NaN value.

e.g. if i had a 3 x 3 matrix

4 7 9
2 7 NaN
1 2 NaN

should become

4 7 9
2 7 7
1 2 2

I have 3 dimensions [i,j,k], but it doesn't matter which dimension I move back in, so long as it is an adjacent element.

Anybody have a solution to my problem?


EDIT:

I guess I could make several loops, find the NaNs and replace e.g i with i-1. But shouldn't there be a more efficient way in Matlab?
 
Last edited:

Answers and Replies

  • #2
402
120
How is the data loaded into the array?
Could you modify the loading to make the adjustments then?
Or at least create a list of indexes so you don't have to search through the array again?
 
  • #3
90
16
How is the data loaded into the array?
Could you modify the loading to make the adjustments then?
Or at least create a list of indexes so you don't have to search through the array again?
no sadly not
 
  • #4
402
120
Sadly the only way I know to do it then would be via 3 nested loops. 49*49*49 shouldn't take too long.
 
  • #6
277
97
What if the first element is a nan? What if a nan is on the an i=1 edge so that there is no i-1 value? This problem can be quickly solved once those questions are addressed.
 
  • #7
90
16
What if the first element is a nan? What if a nan is on the an i=1 edge so that there is no i-1 value? This problem can be quickly solved once those questions are addressed.
"NaN values scattered randomly."
 
  • #8
277
97
"NaN values scattered randomly."
That does not answer my question. In your example you replace one nan by the 7 to its left. You are replaced the other nan with the two to its left. What if the nan is on the left-hand column?
 
  • #9
Here is a 2-D example:

% Create sample data
data = randi(99, 10, 10);
% Introduce 7 nans at random locations
data(randperm(numel(data), 7)) = nan
% Determine location of nans.
nanMap = isnan(data);
% Need to get rid of nan's for imtranslate.
data(nanMap) = -1
% Make an array shifted one column to the right.
replacements = imtranslate(data, [1, 0])
% Initialize a copy of data for our output.
output = data;
% Replace nan's with element to the left
output(nanMap) = replacements(nanMap)
 
  • #10
10
2
vNanIdx = find(isnan(mData));

mData(vNanIdx) = mData(vNanIdx - 1);

Remember MATLAB is Column Major, hence if the Previous item is according to the row, permute the array accordingly (Or use something which depends on the dimensions of the array instead 1).

Pay attention it won't work if the first item is NaN.
 
  • Like
Likes FactChecker
  • #11
FactChecker
Science Advisor
Gold Member
5,787
2,155
Pay attention it won't work if the first item is NaN.
But that is easy to fix as a special case with one line.
 

Related Threads on Replace NaN with next element in Multidimensional Array

Replies
3
Views
12K
Replies
4
Views
742
Replies
5
Views
23K
  • Last Post
Replies
3
Views
2K
Replies
1
Views
2K
Replies
6
Views
12K
  • Last Post
Replies
3
Views
11K
Replies
1
Views
9K
  • Last Post
Replies
1
Views
3K
  • Last Post
Replies
0
Views
2K
Top