Remove rows or cols whose elements are all NaN
182 ビュー (過去 30 日間)
古いコメントを表示
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 件のコメント
採用された回答
Andrei Bobrov
2013 年 3 月 25 日
編集済み: Andrei Bobrov
2013 年 3 月 25 日
out = A(all(~isnan(A),2),:); % for nan - rows
out = A(:,all(~isnan(A))); % for nan - columns
5 件のコメント
Céldor
2015 年 4 月 2 日
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
2018 年 3 月 18 日
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"
その他の回答 (6 件)
Phillippe
2015 年 1 月 14 日
To remove only ALL-NaN columns, do this instead:
A = A(:,~all(isnan(A)));
4 件のコメント
Azzi Abdelmalek
2013 年 3 月 25 日
A(isnan(A))=[]
6 件のコメント
Walter Roberson
2020 年 5 月 28 日
A(all(isnan(A),2),:) = []; %rows that are all nan
A(:, all(isnan(A),1)) = []; %cols that are all nan
Alfaz Memon
2018 年 8 月 20 日
編集済み: Alfaz Memon
2018 年 8 月 21 日
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 件のコメント
Walter Roberson
2018 年 8 月 20 日
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
2018 年 8 月 21 日
編集済み: Alfaz Memon
2018 年 8 月 21 日
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
2013 年 3 月 25 日
Haven't tried this, but it should works:
A(isnan(A))=[];
1 件のコメント
Jan
2013 年 3 月 25 日
This does not solve the wanted: "delete rows or cols whose elements are all NaN"
参考
カテゴリ
Help Center および File Exchange で Resizing and Reshaping Matrices についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!