Verfasst am: 15.01.2016, 12:29
Titel: Berechnung eines cell arrays
Hallo,
Ich bin noch Neuling hier im Forum.
Meine Herausforderung liegt in der Analyse mehrerer .dat files. Sie bestehen je aus 16 Spalten und 630000 zeilen, also 630000 x 16 Datensätzen.
mit:
Code:
nl=630000; nheader=8; ncol=16;
files=dir([filesdir1 '/*.dat']);
filenames={files.name};
for k=1:numel(filenames)
fid = fopen(fullfile(filesdir2,filenames{k}),'r');
formatSpec=repmat('%f',1,ncol);
daten{k} = textscan(fid,formatSpec,nl,'HeaderLines',nheader);
fclose(fid);
end
ausgelesen, erhalte ich einen cell array.
Ziel ist es jeden Datensatz auszuwerten. Hierfür muß ich diese glätten und einer if-Anweisung unterziehen.
Meine bisheriger Quelltext bereitet meinem Rechner enorm viel Arbeit im Gegensatz zu einem Origin file:
Code:
newdata=cell(nl,numel(daten{1,1}),numel(daten));
for i=1:numel(daten) for k=1:numel(daten{1,i}) for l=1:nl
A(:,k)=smooth(daten{1,i}{1,k},4,'moving');
newdata{l,k,i}=A(l,k);
end for l=1:nl
if newdata{l,k,i}<=max(A(:,k))*0.5;
newdata{l,k,i}=100;
else
newdata{l,k,i}=0;
end end end end
Selbst wenn ich das außerhalb des cell array für eine dat.-Datei rechnen lasse:
Code:
for k=1:numel(daten{1,1})
A(:,k)=smooth(daten{1,1}{1,k},4,'moving');
%newdata{l,k,i}=A(l,k);
end
%%
for k=1:numel(daten{1,1}) for l=1:nl
if A(l,k)<=max(A(:,k))*0.5;
B(l,k)=100;
else
B(l,k)=0;
end end end
Verfasst am: 15.01.2016, 13:56
Titel: Re: Berechnung eines cell arrays
Hallo Manni86,
Der Profiler zeigt Dir, in welchen Programmzeilen die meiste Rechenzeit benötigt wird. Dies ist immer das erste Tool, das man bei Effizienz-Problemen verwendet.
Ist das Array A pre-alloziert? Sollte es 630000 Spalten haben (das wird mit aus der Beschreibung nicht klar), würde Matlab SUM(1:630000) mal ein neues Array allozieren müssen und die Werte des alten kopieren. Wenn man stattdessen gleich A per
zeros
mit der entgültigen Größe erstellt, vermeidet man das resourcen-fressenden Wachstum.
Code:
for l=1:nl
A(:,k)=smooth(daten{1,i}{1,k},4,'moving');
newdata{l,k,i}=A(l,k);
end
Auch in der nächsten Schleife wird "max(A(:,k))*0.5" immer wieder neu berechnet. Ziehe es also besser vor die Schleife und speichere das Ergebnis in einer temporären Variable.
Gruß, Jan
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.