delete the row where is a NaN

조회 수: 1 (최근 30일)
Saad
Saad 2013년 1월 14일
Dear all,
I am stuck in a silly programming problem and I would like to ask for some help please.
I have two cells a and b:
a=num2cell(1:10); b=num2cell(1:10);
in each cell, I have 10 column vectors (n x 1). The cell "a" has a NaN that I would like to delete. I also would like to multiply the matrices in each cell. However if I delete some row in a{i} then the matrix size will change so I have to delete the same row in b{i} so that the matrices a{i} and b{i} have the same size. To illustrate what I am trying to achieve, here the structure of my code:
for i=1:10
if a{i}(isnan(a{i}))
%% complete here
end
a{i}'*b{i};
end
I would greatly appreciate if you could help me complete the code. Basically I would like to tell the code "if there is a NaN in a{i}, please delete the row, and show me the row number. Then I will delete the same row in b{i} and finally multiply a{i} and b{i}.
Thanks a lot
Kind Regards
S

채택된 답변

Matt J
Matt J 2013년 1월 14일
편집: Matt J 2013년 1월 14일
Looping will be faster than proposals based on cellfun or arrayfun
for i=1:10
badrows=any(isnan(a{i}),2);
a{i}(badrows,:)=[];
b{i}(badrows,:)=[];
a{i}'*b{i};
end
  댓글 수: 1
Saad
Saad 2013년 1월 14일
Matt
Thanks a lot Matt. Your code was the simplest to understand.

댓글을 달려면 로그인하십시오.

추가 답변 (2개)

Shashank Prasanna
Shashank Prasanna 2013년 1월 14일
편집: Shashank Prasanna 2013년 1월 14일
Is there a requirement to be using cells? if no you can do this quickly without loops, if yes, you can always convert them into cells after you are done.
Let
a = [1 2 nan 4 6 7 nan 7 3 nan 10]
b = [1 2 3 4 6 7 7 7 3 7 10]
b(isnan(a))=[]
a(isnan(a))=[]
c = a.*b
% If you would like:
c = num2cell(c)
  댓글 수: 1
Saad
Saad 2013년 1월 14일
Thank you your help SP.

댓글을 달려면 로그인하십시오.


Azzi Abdelmalek
Azzi Abdelmalek 2013년 1월 14일
% ------Your data-------------
n=4
a1=randi(9,n,10);
b1=randi(9,n,10);
a1( randperm(10*n,10))=nan
a=num2cell(a1)
b=num2cell(b1)
% ------the code---------------
aa=cell2mat(a);
bb=cell2mat(b);
idx=~cellfun(@isnan,a)
out=arrayfun(@(x) aa(idx(:,x)).*bb(idx(:,x)),1:size(aa,2),'un',0)
  댓글 수: 1
Saad
Saad 2013년 1월 14일
Thank you Azzi.

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Matrices and Arrays에 대해 자세히 알아보기

태그

Community Treasure Hunt

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

Start Hunting!

Translated by