Remove rows or cols whose elements are all NaN
152 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Jeon
am 25 Mär. 2013
Kommentiert: verve
am 28 Jan. 2025 um 17:00
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
Akzeptierte Antwort
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
6 Kommentare
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"
verve
am 28 Jan. 2025 um 17:00
A(:,~all(isnan(A))) % for all nan - columns
A(~all(isnan(A),2),:) % for all nan - rows
Weitere Antworten (6)
Phillippe
am 14 Jan. 2015
To remove only ALL-NaN columns, do this instead:
A = A(:,~all(isnan(A)));
4 Kommentare
Azzi Abdelmalek
am 25 Mär. 2013
A(isnan(A))=[]
6 Kommentare
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
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
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
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.
Ilham Hardy
am 25 Mär. 2013
Haven't tried this, but it should works:
A(isnan(A))=[];
1 Kommentar
Jan
am 25 Mär. 2013
This does not solve the wanted: "delete rows or cols whose elements are all NaN"
Siehe auch
Kategorien
Mehr zu Resizing and Reshaping Matrices 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!