# How do I find the indices of NaN values in a cell array?

27 views (last 30 days)

Show older comments

Cai Chin
on 16 Jan 2021

Commented: Walter Roberson
on 17 Jan 2021

##### 0 Comments

### Accepted Answer

Star Strider
on 16 Jan 2021

Try this:

D = load('XTrain2_all.mat');

XTrain2_all = D.XTrain2_all;

hasNaN = cellfun(@nnz,cellfun(@isnan, XTrain2_all, 'Unif',0), 'Unif',0); % Cells With ‘NaN’ Values

idx = find([hasNaN{:}]); % Their Indices

XTrain2_all(idx) = XTrain2_all(idx-1); % Replace With Previous

hasNaN = cellfun(@nnz,cellfun(@isnan, XTrain2_all, 'Unif',0), 'Unif',0); % Check

Check = find([hasNaN{:}]); % Check

.

##### 8 Comments

Star Strider
on 17 Jan 2021

My pleasure!

‘It is a possibility that there will be consecutive missing blocks, so is there any way of essentially scanning through the indices until the last non-NaN index is found and then replacing all the missing blocks with this?’

That would likely require looping through the ‘idx’ values. The first ‘idx’ value would be replaced with the matrix preceeding it, and the subsequent ‘idx’ values as well. It could end up that for consecutive ‘idx’ values, the same matrix could be duplicated consecutively as the result.

‘Also, if there are multiple missing blocks from the first inde onwards, is it possible to scan forwards and replace the missing indices with the next non-NaN index values?’

That would likely require indexing in reverse, starting with the first full (non-NaN) cell matrix and going backwards. I have no idea how you would want to treat the rest of the array, whether going backwards from the last ‘idx’ value to the first would work, or if you would want to treat the various segments of the cell array differently.

In any event, all those possibilities would likely require a loop of some sort.

.

### More Answers (1)

Walter Roberson
on 16 Jan 2021

The below accounts for the possibility of multiple nan blocks.

It does not, however, account for the possibility that the first block is nan (there is no previous block to fill from in that case.)

hasnan = cellfun(@(C) any(isnan(C(:))), XTrain2_all);

idx = 1 : length(C);

idx(hasnan) = 1;

idx = fillmissing(idx, 'previous');

newC = C(idx);

##### 2 Comments

Walter Roberson
on 17 Jan 2021

To also account for the possibility of the first block being nan:

load XTrain2_all.mat

hasnan = cellfun(@(C) any(isnan(C(:))), XTrain2_all);

idx = 1 : length(XTrain2_all);

idx(hasnan) = nan;

idx = fillmissing(fillmissing(idx, 'previous'),'next');

newXTrain2_all = XTrain2_all(idx);

### See Also

### Categories

### Community Treasure Hunt

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

Start Hunting!