Remove rows or cols whose elements are all NaN
    88 views (last 30 days)
  
       Show older comments
    
How can I remove rows or cols whose elements are all NaN ? Withouot any dirty iterations?
For example,
A = [1 1 1 1 1 1 1 1 1 1;
     NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN;
     1 1 1 1 1 1 1 1 1 1;
     NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN;];
should turned into
A = [1 1 1 1 1 1 1 1 1 1;
     1 1 1 1 1 1 1 1 1 1];
This is just an example. Actually I have a very big matrix. So I want a solution of this question to work well with my big matrix.
2 Comments
Accepted Answer
  Andrei Bobrov
      
      
 on 25 Mar 2013
        
      Edited: Andrei Bobrov
      
      
 on 25 Mar 2013
  
      out = A(all(~isnan(A),2),:); % for nan - rows
out = A(:,all(~isnan(A)));   % for nan - columns
6 Comments
  gringer45
      
 on 18 Mar 2018
				This doesn't really do what the question asks for. This selects all the columns or rows with none (zero) NaN values. So, this is answering the question: "Remove rows or cols whose elements have any (at least one) NaN"
  verve
 on 28 Jan 2025
				A(:,~all(isnan(A)))   % for all nan - columns
A(~all(isnan(A),2),:) % for all nan - rows
More Answers (6)
  Phillippe
      
 on 14 Jan 2015
        To remove only ALL-NaN columns, do this instead:
A = A(:,~all(isnan(A)));
4 Comments
  Azzi Abdelmalek
      
      
 on 25 Mar 2013
        A(isnan(A))=[]
6 Comments
  Walter Roberson
      
      
 on 28 May 2020
				A(all(isnan(A),2),:) = [];    %rows that are all nan
A(:, all(isnan(A),1)) = [];   %cols that are all nan
  Alfaz Memon
 on 20 Aug 2018
        
      Edited: Alfaz Memon
 on 21 Aug 2018
  
      input varibale : data
output variable : row_index( index of rows with all the value as NaN)
row_index( index of rows with all the value as NaN)
column_index( index of columns with all the value as NaN)
if(iscell(data))
x =find(cell2mat((cellfun(@(data) any(isnan(data),2),data,'UniformOutput',false)))); 
    [ia,ib] = ind2sub(size(data),x);  
    rows_unique = unique(ia);
    rows_unique(:,2)=histc(ia,rows_unique);
    row_index = rows_unique(find(rows_unique(:,2)==size(data,2)),1);
    columns_unique = unique(ib);
    columns_unique(:,2)=histc(ib,columns_unique);
    column_index = rows_unique(find(columns_unique(:,2)==size(data,1)),1);
else
   row_index  =find(~any(~isnan(data), 2)); % row with all NaN values
   column_index =find(~any(~isnan(data), 1)); %column with all NaN values 
end
2 Comments
  Walter Roberson
      
      
 on 20 Aug 2018
				Seems like a bit of a bother to just remove the rows or columns ?
I notice that you are using cellfun on the data, implying that the data is a cell array; in the original question it was a plain array.
  Alfaz Memon
 on 21 Aug 2018
				
      Edited: Alfaz Memon
 on 21 Aug 2018
  
			yeah its for cell array. for plain array you can remove cellfun and just simply keep  any(isnan(data),2) instead of x =find(cell2mat((cellfun(@(data) any(isnan(data),2),data,'UniformOutput',false))));
this can you work for cell array of different data type.
Also I have updated solution.
See Also
Categories
				Find more on Operators and Elementary Operations 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!



















