Ich möchte eine .txt Datei einlesen. Da dies mit Matlab zu lange dauert bzw. Matlab bei langen .txt Datein sich aufhängt, wollte ich das mit einer .c Datei machen, welche ich über mex aufrufe. Das klappt soweit auch ganz gut, allerdings nur bis zu einer Matrizengröße von 10000x32. Es geht um das einlesen von GPS-Satellitendaten, daher soll zu jeder Epoche (Zeitpunkt) für jeden der 32 Satelliten der aktuelle Wert in die Matrix geschrieben werden. Wie gesagt klappt das auch bis ca. 10.000 Epochen wunderbar, aber dann meldet Matlab einen Fehler ("Matlab funktionert nicht mehr"). Meine Vermutung ist, dass die ausgebebene Matrix "ausmatrix" bzw. dann in Matlab "SAT" für Matlab zu groß ist. SAT hat auch eine viel zu hohe Prezession, mir würden auch 4 Nachkommastellen vollkommen genügen, aber ich schaffs nicht, diese herunterzustellen. Wie ihr an meiner Beschreibung wahrscheinlich schon erraten habt, kenn ich mich auch nicht wirklich gut aus, darum wär ich für jede Hilfe äußerst dankbar, bin am verzweifeln. Google konnte leider auch nicht helfen.
Die Funktion rufe ich mit :
[T_SAMP MJL_START n SAT]=readteqc(file);
auf. Es geht mir um SAT, die eben genannte Matzix ist. Mein c-Code ist unten.
Hi Berlin,
Vielen Dank für deine Antwort. Habs probiert, Matlab bricht aber immer noch bei über 10.000 ab. Evtl. hab ich aber auch was falsch gemacht: Ich hab
geändert bzw. alle möglichen Kombinationen ausprobiert, aber im Ergebnis bliebs das gleiche. Ich versteh auch nicht wirklich,was da geschieht, ich hab mir das mehr aus nem anderen ähnlichen Einlesecode mit try& error zusammengebastelt, daher bitte nicht wundern, wenn ich da saublöde Fehler mach.
Vielen Dank nochmal
Maxi
Servus
Ich hab jetzt weiter rumprobiert, auch mit mxCreateNumericMatrix, nur int ausgeben usw. aber es lief alles immer darauf hinaus, dass für ausmatrix 32x18000 noch funktioniert , eine 32x 19000 Matrix aber nicht mehr. Hat irgend jemand eine Idee, an was das liegen und wie ich das umgehen könnte. Im Anhang ist der c-file sowie eine Beispieldatei, die es einzulesen gilt. aufgerufen wird das mit:
Kleiner Nachtrag: ich hab jetzt alle Matrizen als int definiert und übergebe an Matlab int32, dadurch konnte die Matrizen Größe auf ca. 12x35000 gesteigert werden. Dieser Code ist jetz im Anhang
Gibt es eine Fehlermeldung? Wen ja, welche genau? Wenn nein, in welcher Zeile stürzt die C-Funktion ab?
Du kannst einfach ein paar mexPrintf-Befehle einstreuen und nach der letzten Message suchen, die vor dem Absturz ins Command-Window geschrieben wird.
Hi Jan,
Danke für deinen Post. Leider gibt er keine Fehlermeldung mehr aus, nur ein neues Fenster öffnet sich mit" Matlab funktioniert nicht mehr" (unter Windows 7) bzw. Matlab wird einfach geschlossen (unter XP). Dementsprechend gibt er leider auch keine printf-Sachen mehr aus.
Die Größe der Matrix scheint auch nicht Versions oder PC-abhängig zu sein, da ich es auf nem anderen PC probiert hab mit WinXP und Matlab R2008b und es überall bis 12x37000 geht, 12x 38000 geht aber nicht mehr.
Gibts den noch ne "Zwischenstufe" zwischen int32 und int16 da int32 eigentlich viel zu genau ist, aber int16 ein bisschen zu klein?
So ich hab's jetz mit nem anderen Compiler versucht (bisher wars der standard-compiler Lcc-win32 C 2.4.1 in C:\PROGRA~1\MATLAB\R2009b\sys\lcc). Hab den Microsoft Visual C++ 2008 Express in C:\Program Files\Microsoft Visual Studio 9.0 versucht. Er compilt auch brav aber dann bricht er BIS 37000 epochen ab ("Matlab funktioniert nicht mehr") und AB 38000 epochen bringt er den Fehler "Caught MathWorks::System::FatalException".
Jetzt fällt mir aber schön langsam nix mehr ein, was ich probieren könnt. Falls jemand nur ne leise Ahnung hat, womit das zusammenhängen könnte, wär ich extrem dankbar. Würde ihn auch bei den Danksagungen meiner Diplomarbeit erwähnen.
Dein Programm ist schwer zulesen. Kannst Du nochmal eine bereinigte Version posten, in denen z.B. die blockweise auskommentierten Zeilen weggelassen sind?
Oder auch dies liesse sich vereinfachen:
Wenn danach der Code übersichtlicher ist, wird das Fehlersuchen einfacher.
Es ist unbedingt nötig, dass Du heraus bekommst, in welcher Zeile das Programm abbricht. Wenn Du es per mexPrintf nicht schaffst, versuche in ein File zu schreiben. Das Wechseln des Datentyps wird wenig bringen, da ein solcher Crash einen echten Grund hat.
Hi Jan,
erstmal danke für deinen Tip mit der Vereinfachung. Ich hab den Code jetzt auf das nötigste reduziert (glaube ich wenigstens) und etwas auskommentiert.
Ich hab auch versucht, dass der .c-Code für jeden Schritt der while Schleife den Wert in eine .txt Datei schreibt. Funktioniert auch wieder wunderbar bis 37000, aber ab 38000 bricht er ab, ohne irgendwas hineinzuschreiben. Habe den .txt-Schreibbefehl auch mal ganz an den Anfang des Codes gesetzt, so dass er eine 1 in die .txt-Datei schreiben soll, auch dass fand nicht mehr statt (bei über 38000).
Ist es dann ein Problem der Initialisierung?
Vielen Dank nochmal und frohes Faschingstreiben
Maxi
for(i=0;i<satnum;i++) { zwischen=atof(&GetString[10*i]); /*zwischen ist ein Hilfskonstrukt, um die floats in Integers zu verwandeln*/
datenmatrix[epochs][i]=(int)(zwischen*1000);} /*im MATLAB code wird die Matrix dann wieder durch 1000 geteilt*/
epochs++; /*Anzahl der Epochen, also jede Zweite Zeile (Epoche=Messpunkt)*/
}
/* Ausgabematrix schreiben*/
/*mixt satmatrix und datenmatrix, so dass z.B. die Daten zu Satellit 16 in Zeile 16 stehen und satmatrix nicht mehr benötigt wird*/
for(k=0;k<epochs;k++) { j=0;
for(i=1;i<=32;i++) {if(satmatrix[k][j]==i) {ausmatrix[k][i-1]=(datenmatrix[k][j]);
j++;
}}}
Ich hab auch versucht, dass der .c-Code für jeden Schritt der while Schleife den Wert in eine .txt Datei schreibt.
Es gibt mehrere WHILE-Schleifen in Deinem Code. Könnte ich wissen, welche du meinst?
Bis 37000 läuft das Programm, bei 38000 läuft es nicht? Was passiert den bei 37001 bis 37999? Wenn Du das Problem lösen möchtest, wäre es sehr hilfreich, wenn Du die genau Zahl wüßtest. Das sind immerhin nur 10 Versuche, wenn Du das Intervall immer halbierst. Tritt das Problem vor dem Schrieben der Ausgabe-Matrix auf? Dann lasse doch auch die "* Ausgabematrix schreiben*/ " und "/* Ausgabe */ "-Teile zunächst mal weg. Reduziere Dein Programm so lange, bis wirklich nur noch die Zeilen übrig bleiben, die den Fehler produzieren. Du kannst auch probieren das File-Einlesen wegzulassen: nimm einfach immer den gleichen String. Wenn das auch nicht läuft, hat es schonmal nichts mit den FGETS-Zeilen zu tun.
Das gepostete Programm läuft natürlich nur bis 37000, da du ja am Anfang auch nur 37000 Zeilen reservierst. Ich rate zwar mal, dass Du das dann manuell im Code änderst, aber wissen kann ich das nicht. Es sieht auf jeden Fall so aus, als würdest Du in nicht-reservierten Speicher schreiben.
Ich habe nun alle Tricks verraten, die ich auch anwenden würde. Den Rest überlasse ich Dir oder anderen goMatlab'ern.
Äh ja, das mit den Programmteilen weglassen war eigenltich ziemlich naheliegend... da hab ich den Wald vor lauter Bäumen nicht gesehen. Also er bricht auch ab, wenn nur initialisiert wird und ansonsten gar nix mehr im code steht. Die genaue Zahl ist 37358, ab 37359 hängt er sich auf und du hast recht ich habs jedesmal im Code geändert.
Jetz weiß ich ja doch ziemlich genau wo der Fehler liegt und ich weiß, wie ich da beim nächsten mal bei solchen Problemen vorgehe.
Herzlichen Dank nochmal für deine Mühen
Maxi
Kleiner Nachtrag: Durch geschicktere Programmierung (spar mir satmatrix und datenmatrix) schaff ich's jetz immerhin auf ca. 65000 Epochen, is ja auch schon was.
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.