Zur Weiterverarbeitung von Simulationsdaten aus MSC ADAMS mit dem Reifenmodell FTire werden Daten diskreter Punkte der Reifenaufstandsfläche (Latsch) in einem file (ftire.cfo) gespeichert. Je nach Simulationsdauer ist die Datenflut "riesig". Das führt zu dem Problem das ein komplettes Einlesen in Matlab seeeehr lange dauert.
Zudem kommt, dass das *.cfo file nicht nur aus Datennwerten in Tabellenform besteht, sondern nach Zeitschritten (immer unterschiedlich, da Integrationszeit) in Blöcken sortiert ist. Diese Blöcke sind je nachdem wieviele Punkte in Kontakt mit dem untergrund stehen unterschiedliche groß.
Die jeweiligen Blöcke haben immer die selbe Spaltenreihenfolge. Also z.B. 1. Spalte=pos_x, 2. Spalte=pos_y, usw. --> siehe angehängte *.txt
Das Einlesen und Sortieren in ein Struct-Array funktioniert. Nur dauert es ewig.
Außerdem fehlt mir noch eine elegange Lösung nur einzelne Spalten wie z.B. pos_x und pos_y einzulesen sodass ich sie anschließend plotten kann.
Code:
%% Laden der Zeitschritte & Zugehörigen Blockstärke % Timer Starten tic
% Öffnen des *.cfo-files
fidT = fopen('FTire\ftire001.cfo');
i=1;
% While schleife zum finden der Zeitschritte & Anzahl der Zeilen im Block while ~feof(fidT)% Lesen bis zum Ende der Datei
stringT = fgetl(fidT); % Zeile auslesen
iflength(stringT)>2 && strcmpi(stringT(3),'t')% Wenn Zeilenlänge größer 2 & drittes char-Element ein t ist -> weitermachen!!
formatSpec1 = '%*s %*s %f %d %*[^\n]'; % Definition des Formats zum Einlesen
T(i,:) = textscan(stringT, formatSpec1); % Einlesen der Zeit und Blockgröße und Abspeichern in C, Weiter wird die Position des Suchers festgehalten
FTire(i).time = cell2mat(T(i,1)); % Zeit ins Struct-Array schreiben
FTire(i).size = cell2mat(T(i,2)); % Blockgröße ins Struct-Array schreiben
%% Sortieren der Daten in das im ersten Block angelegte Struct-Array % ...
start=1; % Start-Zeile zum Auslesen der Werte aus der Matrix
ende=0; % Letzte-Zeile zum Auslesen der Werte aus der Matrix
p=1; % Variable als Abbruchbedingung des Struct-Arrays
meine einzulesenden Spalten auswählen kann ist mir klar. Ich habe das ganze auch in einer Funktion mit unterschiedlichen einleseformaten als Eingang umgesetzt.
Meine Frage ist jetzt, liegt die lange Einlesezeit "auch" daran das meine Skript einfach umständlich geschrieben oder es eine "blöde" Art und Weise der Umsetzung ist?
meine einzulesenden Spalten auswählen kann ist mir klar. Ich habe das ganze auch in einer Funktion mit unterschiedlichen einleseformaten als Eingang umgesetzt.
Meine Frage ist jetzt, liegt die lange Einlesezeit "auch" daran das meine Skript einfach umständlich geschrieben oder es eine "blöde" Art und Weise der Umsetzung ist?
wenn ich das richtig sehe, gehst du ja beide Male komplett durch die Datei durch.
Unterscheiden sich die eingelesenen Blöcke stark in der Größe, oder etwas ähnliches?
Wieviel Hauptspeicher (RAM) hast du? Beobachte mal die Speicherauslastung im Task Manager.
Hi,
Ja genau. Die Textdatei wird zweimal komplett durchlaufen. Einmal um die Integrationsschritte abzuspeichern und die Blockgrößen festzuhalten. beim zweiten mal werden alle Zeilen außer die, in denen Zeit und Blockgröße steht, nacheinander eingelesen und in Matrix A abgespeichert.
Die Spaltern der unterschiedlichen Blöcke sind gleich. Die Anzahl der Zeilen in den jeweiligen Blöcken unterscheidet sich allerdings. Anzahl Zeilen zwischen 1 - 200 pro Block.
Mein System hat 8GB RAM. Gibt es die Möglichkeit den von Matlab benutzbaren Speicher einzustellen?
hilft leider nicht viel, da ich sowohl außer den unwichtigen mit % beginnenden Zeilen auch Leerzeilen vorhanden sind. Die muss ich ja auch durchsuchen...
Gibt es nicht die möglichkeit die Position in der Textdatei exakt zu definieren, also in der Art: Springe an die Position 350 im Textfile und lese dann 10 Zeichen aus.
hilft leider nicht viel, da ich sowohl außer den unwichtigen mit % beginnenden Zeilen auch Leerzeilen vorhanden sind. Die muss ich ja auch durchsuchen...
Was meinst du damit? Insbesondere: was willst du in den Leerzeilen suchen?
Die werden einfach übersprungen.
Zitat:
Gibt es nicht die möglichkeit die Position in der Textdatei exakt zu definieren, also in der Art: Springe an die Position 350 im Textfile und lese dann 10 Zeichen aus.
Mit Headerlines kannst du Zeilen überspringen. Mit ftell/fseek kannst du in der Datei beliebig springen. Ich frage mich aber, was das hier bringen soll.
Hi Harald, das mit den Leereichen überspringen klappt. Hatte einen Denkfehler an der Stelle. Das ganze funktioniert auch schneller als meine erste Methode. Danke dafür.
Habe jetzt ein weiteres kleines Problem. Je nach Simulationsverlauf kann es dazu kommen, dass am ende meiner *.cfo Datei mehrer Zeilen mit Leerzeichen sind. Aus diesem Grund kommt es zu Fehlern in meinem Skript, wenn ich nicht vorher die Leerzeichen am Ende lösche.
Gibt es einen Befehl den ich vorschalten kann, sodass zunächst alle Leerzeichen am Ende bis zum ersten richtigen Zeichen Gelöscht werden?
ich würde es umgekehrt machen: alles einlesen und eventuelle ungültige Zeilen nachträglich entfernen.
Ansonsten wie immer: bitte konkretes Beispiel, welcher Code verwendet wird und warum es dabei zu Problemen kommt.
Rein aus Neugierde: wie ist die Dauer im Vergleich vorher/nachher?
Hi Harald,
der Unterschied ist enorm. Bei meinem Alten Skript wurde ja die Datei Zeile für Zeile in einer Schleife eingelesen. Da dauerte das Einlesen der etwa 500MB (wenn ich die Leerzeichen manuell entfernt habe) 18h
Mit der jetzigen Methode nur etwa 2Minuten! Besser gehts nicht.
Das Problem das ich jetzt beim Einlesen der *.cfo habe wird mit folgendermaßen angezeigt
Error using cat
Dimensions of matrices being concatenated are not consistent.
Error in cell2mat (line 75)
m{n} = cat(2,c{n,:});
Error in Imp_FTire_cfo_Vers2 (line 70)
B = cell2mat(A);
Der Betreffende Code ist dieser hier:
Code:
%% Laden der Daten aus dem File % Starten des Timers tic
% Öffnen des Files
fidA = fopen(file); % Öffnen der *.txt
% Variable für die Spalte der Matrix A
a=1;
% Auslesen der Daten
A = textscan(fidA, Format, 'CommentStyle','%','HeaderLines',4); % Einlesen der Daten und Ablegen in Matrix A
Zur Weiterverarbeitung von Simulationsdaten aus MSC ADAMS mit dem Reifenmodell FTire werden Daten diskreter Punkte der Reifenaufstandsfläche (Latsch) in einem file (ftire.cfo) gespeichert. Je nach Simulationsdauer ist die Datenflut "riesig". Das führt zu dem Problem das ein komplettes Einlesen in Matlab seeeehr lange dauert.
Zudem kommt, dass das *.cfo file nicht nur aus Datennwerten in Tabellenform besteht, sondern nach Zeitschritten (immer unterschiedlich, da Integrationszeit) in Blöcken sortiert ist. Diese Blöcke sind je nachdem wieviele Punkte in Kontakt mit dem untergrund stehen unterschiedliche groß.
Die jeweiligen Blöcke haben immer die selbe Spaltenreihenfolge. Also z.B. 1. Spalte=pos_x, 2. Spalte=pos_y, usw. --> siehe angehängte *.txt
Das Einlesen und Sortieren in ein Struct-Array funktioniert. Nur dauert es ewig.
Außerdem fehlt mir noch eine elegange Lösung nur einzelne Spalten wie z.B. pos_x und pos_y einzulesen sodass ich sie anschließend plotten kann.
Code:
%% Laden der Zeitschritte & Zugehörigen Blockstärke % Timer Starten tic
% Öffnen des *.cfo-files
fidT = fopen('FTire\ftire001.cfo');
i=1;
% While schleife zum finden der Zeitschritte & Anzahl der Zeilen im Block while ~feof(fidT)% Lesen bis zum Ende der Datei
stringT = fgetl(fidT); % Zeile auslesen
iflength(stringT)>2 && strcmpi(stringT(3),'t')% Wenn Zeilenlänge größer 2 & drittes char-Element ein t ist -> weitermachen!!
formatSpec1 = '%*s %*s %f %d %*[^\n]'; % Definition des Formats zum Einlesen
T(i,:) = textscan(stringT, formatSpec1); % Einlesen der Zeit und Blockgröße und Abspeichern in C, Weiter wird die Position des Suchers festgehalten
FTire(i).time = cell2mat(T(i,1)); % Zeit ins Struct-Array schreiben
FTire(i).size = cell2mat(T(i,2)); % Blockgröße ins Struct-Array schreiben
%% Sortieren der Daten in das im ersten Block angelegte Struct-Array % ...
start=1; % Start-Zeile zum Auslesen der Werte aus der Matrix
ende=0; % Letzte-Zeile zum Auslesen der Werte aus der Matrix
p=1; % Variable als Abbruchbedingung des Struct-Arrays
Zur Weiterverarbeitung von Simulationsdaten aus شركة ت.....585;ياض ADAMS mit dem Reifenmodell شركة م.....585;ياضFTire werden Daten diskreter Punkte der Reifenaufstandsfläche (Latsch) in einem file (ftire.cfo) gespeichert. Je nach Simulationsdauer ist die Datenflut "riesig". Das führt zu dem Problem das ein komplettes Einlesen in Matlab seeeehr lange dauert.
Zudem kommt, dass das *.cfo file nicht nur aus Datennwerten in شركة ج.....585;ياضTabellenform besteht, sondern nach Zeitschritten (immer unterschiedlich, da Integrationszeit) in Blöcken sortiert ist. Diese Blöcke sind je nachdem wieviele Punkte in Kontakt mit dem untergrund stehen unterschiedliche groß.
Die jeweiligen Blöcke haben immer die selbe Spaltenreihenfolge. Also z.B. 1. Spalte=pos_x, 2. Spalte=pos_y, usw. --> siehe angehängte *.txt
Das Einlesen und Sortieren in ein Struct-Array funktioniert. Nur dauert es ewig.
Außerdem fehlt mir noch eine elegange Lösung nur einzelne Spalten wie z.B. pos_x und pos_y einzulesen sodass ich sie anschließend plotten kann.
Code:
%% Laden der Zeitschritte & Zugehörigen Blockstärke % Timer Starten tic
% Öffnen des *.cfo-files
fidT = fopen('FTire\ftire001.cfo');
i=1;
% While schleife zum finden der Zeitschritte & Anzahl der Zeilen im Block while ~feof(fidT)% Lesen bis zum Ende der Datei
stringT = fgetl(fidT); % Zeile auslesen
iflength(stringT)>2 && strcmpi(stringT(3),'t')% Wenn Zeilenlänge größer 2 & drittes char-Element ein t ist -> weitermachen!!
formatSpec1 = '%*s %*s %f %d %*[^\n]'; % Definition des Formats zum Einlesen
T(i,:) = textscan(stringT, formatSpec1); % Einlesen der Zeit und Blockgröße und Abspeichern in C, Weiter wird die Position des Suchers festgehalten
FTire(i).time = cell2mat(T(i,1)); % Zeit ins Struct-Array schreiben
FTire(i).size = cell2mat(T(i,2)); % Blockgröße ins Struct-Array schreiben
%% Sortieren der Daten in das im ersten Block angelegte Struct-Array % ...
start=1; % Start-Zeile zum Auslesen der Werte aus der Matrix
ende=0; % Letzte-Zeile zum Auslesen der Werte aus der Matrix
p=1; % Variable als Abbruchbedingung des Struct-Arrays
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.