removing rows contain NaN element from 3D array

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

Accepted Answer

Guillaume
Guillaume on 21 Oct 2016
Edited: Guillaume on 21 Oct 2016
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.

More Answers (2)

Andrei Bobrov
Andrei Bobrov on 21 Oct 2016
Edited: Andrei Bobrov on 21 Oct 2016
out = arrayfun(@(x)A(all(~isnan(A(:,:,x)),2),:,x),1:size(A,3),'un',0);

KSSV
KSSV on 21 Oct 2016
Edited: 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}.

Categories

Find more on Matrices and Arrays in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by