MATLAB Answers

0

removing rows contain NaN element from 3D array

Asked by sermet on 21 Oct 2016
Latest activity Edited by KSSV
on 21 Oct 2016
A(:,:,1) =
NaN NaN NaN 1.000000000000000
NaN NaN NaN 1.000000000000000
NaN NaN NaN 1.000000000000000
-0.251395732283393 0.831232695305901 0.495835045195662 1.000000000000000
-0.351395732283393 0.831232695305901 0.495835045195662 1.000000000000000
NaN NaN NaN 1.000000000000000
0.223016679421216 0.961124117481440 -0.162800465280223 1.000000000000000
A(:,:,2) =
NaN NaN NaN 1.000000000000000
NaN NaN NaN 1.000000000000000
NaN NaN NaN 1.000000000000000
-0.294547842132722 0.762119326903777 0.576555027950231 1.000000000000000
NaN NaN NaN 1.000000000000000
0.208731731285917 0.936100623203798 -0.283101903193612 1.000000000000000
NaN NaN NaN 1.000000000000000
How can I remove rows contain NaN from 3D A array? After removing each row contain NaN, sub-arrays' dimensions will not be equal. Is it allowed in Matlab?

  0 Comments

Sign in to comment.

3 Answers

Answer by Guillaume
on 21 Oct 2016
Edited by Guillaume
on 21 Oct 2016
 Accepted Answer

No, you cannot have different size pages in a matrix.
You could convert the 3D array into a cell array of 2D matrices and remove the nans from these matrices:
cellA = num2cell(A, [1 2]); %keep dimension 1 and 2 together
nonancellA = cellfun(@(m) m(~any(isnan(m), 2), :), cellA, 'UniformOutput', false);
Whether or not it makes later processing easier, only you can say.

  0 Comments

Sign in to comment.


Answer by Andrei Bobrov
on 21 Oct 2016
Edited by Andrei Bobrov
on 21 Oct 2016

out = arrayfun(@(x)A(all(~isnan(A(:,:,x)),2),:,x),1:size(A,3),'un',0);

  0 Comments

Sign in to comment.


Answer by KSSV
on 21 Oct 2016
Edited by KSSV
on 21 Oct 2016

You can take the output in cell.
[m,n,p] = size(A) ;
iwant = cell(p,1) ;
for i = 1:p
% get Nan's from first column
temp = A(:,1,i) ;
id = ~isnan(temp) ;
iwant{i} =A(id,:,i) ;
end
You can access the required matrix using iwant{1}, iwant{2}.

  0 Comments

Sign in to comment.