How to quickly find the first NaN?
10 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 Structures 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!