Remove rows or cols whose elements are all NaN

288 Ansichten (letzte 30 Tage)
Jeon
Jeon am 25 Mär. 2013
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 Kommentare
Dev-iL
Dev-iL am 13 Jul. 2014
Bearbeitet: Dev-iL am 13 Jul. 2014
Hi! You can find some clues here: A discussion of the opposite problem on SE. I personally achieved what you were attempting using:
A(~any(~isnan(A), 2),:)=[];
Walter Roberson
Walter Roberson am 20 Sep. 2015
Michal Gajewski commented
works

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

Andrei Bobrov
Andrei Bobrov am 25 Mär. 2013
Bearbeitet: Andrei Bobrov am 25 Mär. 2013
out = A(all(~isnan(A),2),:); % for nan - rows
out = A(:,all(~isnan(A))); % for nan - columns
  5 Kommentare
Céldor
Céldor am 2 Apr. 2015
Can I obtain a logical matrix I of indices to be held / removed something like
I = something here
and then use assign an altered matrices:
out1 = out1(I);
out2 = out2(I);
% ... etc.
Thanks
gringer45
gringer45 am 18 Mär. 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"

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (6)

Phillippe
Phillippe am 14 Jan. 2015
To remove only ALL-NaN columns, do this instead:
A = A(:,~all(isnan(A)));
  4 Kommentare
Parth Dev Bundela
Parth Dev Bundela am 22 Okt. 2022
Thanks man
osman alper altun
osman alper altun am 14 Feb. 2023
Thank you!

Melden Sie sich an, um zu kommentieren.


Azzi Abdelmalek
Azzi Abdelmalek am 25 Mär. 2013
A(isnan(A))=[]
  5 Kommentare
Serafeim Zacharopoulos
Serafeim Zacharopoulos am 27 Mai 2020
To delete rows with all NaN's, maybe try this:
A = A(find(sum(~isnan(A)'))',:)
Walter Roberson
Walter Roberson am 28 Mai 2020
A(all(isnan(A),2),:) = []; %rows that are all nan
A(:, all(isnan(A),1)) = []; %cols that are all nan

Melden Sie sich an, um zu kommentieren.


Saman
Saman am 23 Okt. 2013
Bearbeitet: Saman am 23 Okt. 2013
Use this :
out = A(:,any(~isnan(A))); % for columns
out = A(any(~isnan(A),2),:); %for rows

Alfaz Memon
Alfaz Memon am 20 Aug. 2018
Bearbeitet: Alfaz Memon am 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 Kommentare
Walter Roberson
Walter Roberson am 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
Alfaz Memon am 21 Aug. 2018
Bearbeitet: Alfaz Memon am 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.

Melden Sie sich an, um zu kommentieren.


Ilham Hardy
Ilham Hardy am 25 Mär. 2013
Haven't tried this, but it should works:
A(isnan(A))=[];
  1 Kommentar
Jan
Jan am 25 Mär. 2013
This does not solve the wanted: "delete rows or cols whose elements are all NaN"

Melden Sie sich an, um zu kommentieren.


Nike
Nike am 25 Mär. 2013
Simplest is
A(isnan(A))= [];
  1 Kommentar
Jan
Jan am 25 Mär. 2013
This has been posted twice already. But it still does not solve the original question:
delete rows or cols whose elements are all NaN
For e.g. A = [1, NaN, 1; NaN, 1, NaN] nothing should be deleted.

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Matrices and Arrays finden Sie in Help Center und File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by