How to quickly find the first NaN?
    17 visualizaciones (últimos 30 días)
  
       Mostrar comentarios más antiguos
    
    Serbring
 el 14 de Oct. de 2019
  
    
    
    
    
    Editada: Walter Roberson
      
      
 el 14 de Oct. de 2019
            Hi all,
I am converting more than 100GB of .ASC CAN BUS data. The algorithm is pretty slow due to the fact there are struct data inside a struct data. Below you will find a basic example of my code. The line that makes it pretty slow is the following because it is looped more than a million of times.
        Pos2Paste=find(isnan(Sigs{iSig2Load(j)}),1);
Is there a faster way to find the first NaN element where I can assign the value found in the struct? Maybe, I can speed up the code in another way? 
Thank you in advance.
Best regards
SigNames={'s1','s2','s3','s4','s5'; 'a1','a1','a1','a2','a2'};
MessLength=40;
for i=1:2:MessLength
    messageStruct(i).Name='a1';
    messageStruct(i).Signals.s1=1;
	messageStruct(i).Signals.s2=2;
    messageStruct(i).Signals.s3=3;
end
for i=2:2:MessLength
    messageStruct(i).Name='a2';
	messageStruct(i).Signals.s4=4;
    messageStruct(i).Signals.s5=5;
end
UniqueMessFound=unique({messageStruct.Name});
UniqueMessageCount=countcats(categorical({messageStruct.Name},UniqueMessFound));
for iSig=1:length(SigNames(1,:))
    Sigs{iSig}=NaN(UniqueMessageCount(strcmp(UniqueMessFound,SigNames{2,iSig})),1);
end
for i=1:MessLength
	Sig=fieldnames(messageStruct(i).Signals);
	[~,iSig2Load , iSig]=intersect(SigNames(1,:),Sig);
	Sig2Sel=SigNames(1,iSig2Load);
    for j=1:length(Sig2Sel)
        Pos2Paste=find(isnan(Sigs{iSig2Load(j)}),1);
        Sigs{iSig2Load(j)}(Pos2Paste)=single(messageStruct(i).Signals.(Sig{iSig(j)}));
    end
end
0 comentarios
Respuesta aceptada
  Walter Roberson
      
      
 el 14 de Oct. de 2019
        
      Editada: Walter Roberson
      
      
 el 14 de Oct. de 2019
  
      You could adapt https://www.mathworks.com/matlabcentral/fileexchange/24641-vectorized-find-with-first-option to do the nan testing.
0 comentarios
Más respuestas (1)
  Mir Amid Hashemi
      
 el 14 de Oct. de 2019
        
      Editada: Mir Amid Hashemi
      
 el 14 de Oct. de 2019
  
      Hi,
I put MessLength to 40000. I would think the bigger worry is line 23 with intersection. Isn't it?
If you are using it to find signals in a few SigNames can't you make a faster line there?

I'm sorry I'm dodging the question maybe.
Ver también
Categorías
				Más información sobre Logical en Help Center y File Exchange.
			
	Productos
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!


