<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Matrizen aus Datei parsen mit Variablen]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>für ein Projekt mit Matrizenrechnung muss ich einige Matrizen aus einer Datei einlesen können.<br />
Außerdem ist es wichtig, dass auch variablen und arithmetische Ausdrücke vorkommen können.<br />
Hier mal eine Beispieldatei:</p>
<blockquote>
<p>%list of variables<br />
w_f = 0; %kommentar...<br />
w_s = 1e10;<br />
dt = 0.123123;</p>
<p>A = [1,2,3;4,5,6; w_f*w_s*dt];</p>
<p>asd = 2.34; % variablen können auch mittendrin deklariert werden</p>
<p>B = [1,2;3,4;5,6.243];</p>
</blockquote>
<p>Das Format der Datei kann ich selbst festlegen, es sollte aber möglichst benutzerfreundlich sein.<br />
Variablen sollen (erstmal) nur konstante double-Werte sein können, sie dürfen nicht durch weitere variablen berefchnet werden (um das ganze einfach zu halten).<br />
Da es bei diesem Teilprojekt um eine Portierung von Matlab nach C++ geht, habe ich eine Matlab-ähnliche Syntax gewählt.</p>
<p>Ich hatte jetzt vor, dass ganze in mehereren Schritten zu parsen:<br />
Im 1. Schritt werden (vermutlich mithilfe von Regex) Kommentare entfernt und dann splitte ich alles was übrig bleibt am Semikolon und erhalte einige strings, die ich dann nacheinander abarbeite.</p>
<p>Bei der Verarbeitung eines String ersetze ich zuerst alle variablen durch die jeweiligen Werte (hatte vor, dass auch irgendwie mit regex zu machen, wie genau muss ich noch schaun).<br />
Danach überprüf ich, ob eckige Klammern vorhanden sind.<br />
Wenn ich eckige Klammern finde, weiß ich, dass es sich um eine Matrix handelt, wenn nicht ist es eine Variable, die in eine map die von string nach double mappt aufgenommen wird.<br />
Handelt es sich um eine Matrix, dann splitte ich am semikolon, um die einzelnen zeilen zu erhalten und danach für jede Zeile nochmal am komma, um einzelne Ausdrücke zu erhalten.<br />
Dann werden erstmal die dimensionen auf konsistenz geprüft und dann die einzelnen ausdrücke ausgewertet (wie bei einem taschenrechner-programm).<br />
Zum parsen von diesen Ausdrücken die dann rauskommen habe ich schon gutes Material aus einem Buch.</p>
<p>Soweit der Plan <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":-)"
      alt="🙂"
    /></p>
<p>Mir fällt gerade noch auf, dass ich das Semikolon für 2 verschiedene Zwecke missbraucht hab, 1 mal zum Markieren, dass eine Anweisung/Variablendefinition zuende ist und einmal zum markieren vom ende einer spalte. Ich werd eins von beiden dann wohl am besten erstezen, nur habe ich noch keine &quot;gutaussehende&quot; alternative gefunden.</p>
<p>Ich wollte fragen, ob ihr dazu noch tipps oder Verbesserungsvorschläge habt.<br />
Da ich das Format selbst wählen kann, sind vielleicht noch Vereinfachungen möglich, die mir entgangen sind.</p>
<p>Vielen Dank schonmal für eure Hilfe!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/294459/matrizen-aus-datei-parsen-mit-variablen</link><generator>RSS for Node</generator><lastBuildDate>Sat, 15 Aug 2026 21:44:21 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/294459.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 25 Oct 2011 14:17:30 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Matrizen aus Datei parsen mit Variablen on Tue, 25 Oct 2011 14:27:12 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>für ein Projekt mit Matrizenrechnung muss ich einige Matrizen aus einer Datei einlesen können.<br />
Außerdem ist es wichtig, dass auch variablen und arithmetische Ausdrücke vorkommen können.<br />
Hier mal eine Beispieldatei:</p>
<blockquote>
<p>%list of variables<br />
w_f = 0; %kommentar...<br />
w_s = 1e10;<br />
dt = 0.123123;</p>
<p>A = [1,2,3;4,5,6; w_f*w_s*dt];</p>
<p>asd = 2.34; % variablen können auch mittendrin deklariert werden</p>
<p>B = [1,2;3,4;5,6.243];</p>
</blockquote>
<p>Das Format der Datei kann ich selbst festlegen, es sollte aber möglichst benutzerfreundlich sein.<br />
Variablen sollen (erstmal) nur konstante double-Werte sein können, sie dürfen nicht durch weitere variablen berefchnet werden (um das ganze einfach zu halten).<br />
Da es bei diesem Teilprojekt um eine Portierung von Matlab nach C++ geht, habe ich eine Matlab-ähnliche Syntax gewählt.</p>
<p>Ich hatte jetzt vor, dass ganze in mehereren Schritten zu parsen:<br />
Im 1. Schritt werden (vermutlich mithilfe von Regex) Kommentare entfernt und dann splitte ich alles was übrig bleibt am Semikolon und erhalte einige strings, die ich dann nacheinander abarbeite.</p>
<p>Bei der Verarbeitung eines String ersetze ich zuerst alle variablen durch die jeweiligen Werte (hatte vor, dass auch irgendwie mit regex zu machen, wie genau muss ich noch schaun).<br />
Danach überprüf ich, ob eckige Klammern vorhanden sind.<br />
Wenn ich eckige Klammern finde, weiß ich, dass es sich um eine Matrix handelt, wenn nicht ist es eine Variable, die in eine map die von string nach double mappt aufgenommen wird.<br />
Handelt es sich um eine Matrix, dann splitte ich am semikolon, um die einzelnen zeilen zu erhalten und danach für jede Zeile nochmal am komma, um einzelne Ausdrücke zu erhalten.<br />
Dann werden erstmal die dimensionen auf konsistenz geprüft und dann die einzelnen ausdrücke ausgewertet (wie bei einem taschenrechner-programm).<br />
Zum parsen von diesen Ausdrücken die dann rauskommen habe ich schon gutes Material aus einem Buch.</p>
<p>Soweit der Plan <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":-)"
      alt="🙂"
    /></p>
<p>Mir fällt gerade noch auf, dass ich das Semikolon für 2 verschiedene Zwecke missbraucht hab, 1 mal zum Markieren, dass eine Anweisung/Variablendefinition zuende ist und einmal zum markieren vom ende einer spalte. Ich werd eins von beiden dann wohl am besten erstezen, nur habe ich noch keine &quot;gutaussehende&quot; alternative gefunden.</p>
<p>Ich wollte fragen, ob ihr dazu noch tipps oder Verbesserungsvorschläge habt.<br />
Da ich das Format selbst wählen kann, sind vielleicht noch Vereinfachungen möglich, die mir entgangen sind.</p>
<p>Vielen Dank schonmal für eure Hilfe!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2135620</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2135620</guid><dc:creator><![CDATA[*Q* 1]]></dc:creator><pubDate>Tue, 25 Oct 2011 14:27:12 GMT</pubDate></item><item><title><![CDATA[Reply to Matrizen aus Datei parsen mit Variablen on Tue, 25 Oct 2011 15:09:59 GMT]]></title><description><![CDATA[<p>ersetze einfach die Zeichen &quot;;\n&quot; durch &quot;\n&quot;. Weil es in MATLAB sowieso immer die letzte Anweisung in einer Zeile ist</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2135659</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2135659</guid><dc:creator><![CDATA[asdsad]]></dc:creator><pubDate>Tue, 25 Oct 2011 15:09:59 GMT</pubDate></item><item><title><![CDATA[Reply to Matrizen aus Datei parsen mit Variablen on Tue, 25 Oct 2011 15:22:03 GMT]]></title><description><![CDATA[<p>Dann sind mehrere Anweisungen pro Zeile und Anweisungen über mehrere Zeilen aber nicht mehr möglich, oder sehe ich das falsch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2135661</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2135661</guid><dc:creator><![CDATA[*Q* 1]]></dc:creator><pubDate>Tue, 25 Oct 2011 15:22:03 GMT</pubDate></item><item><title><![CDATA[Reply to Matrizen aus Datei parsen mit Variablen on Tue, 25 Oct 2011 17:40:25 GMT]]></title><description><![CDATA[<p>Q schrieb:</p>
<blockquote>
<p>Dann sind mehrere Anweisungen pro Zeile und Anweisungen über mehrere Zeilen aber nicht mehr möglich, oder sehe ich das falsch?</p>
</blockquote>
<p>Lesbarer Code sollte sowieso nicht mehr als eine Anweisung je Zeile haben.</p>
<p>Anweisungen über mehrere Zeilen gehen nicht, es sei denn du verwendest den ... Operator und den kannst du ja auch herausfiltern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2135721</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2135721</guid><dc:creator><![CDATA[asdsad]]></dc:creator><pubDate>Tue, 25 Oct 2011 17:40:25 GMT</pubDate></item><item><title><![CDATA[Reply to Matrizen aus Datei parsen mit Variablen on Tue, 25 Oct 2011 19:43:33 GMT]]></title><description><![CDATA[<p>Ich geb dir zwei Tipps.</p>
<p>1. Du solltest das nicht irgendwie zusammenfrickeln, sondern dich erstmal zum Thema Syntaxanalyse, Parsing, Grammatiken usw. schlau machen.</p>
<p>2. Benutze keine allzustark an Matlab angelehnte Syntax. Denn die User werden irgendwann fordern, dass du mehr und mehr Sprachelemente von Matlab unterstützt. Dabei wolltest du eigentlich nur ein Datenformat ... Außerdem ist die Matlab-Grammatik grottig zu parsen (die ist anscheinend entwickelt worden, ohne meinen Tipp 1 zu beherzigen, was ironischerweise bedeuten kann, dass du mit Handgefrickel doch am schnellsten zum Ziel kommst <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> )</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2135787</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2135787</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Tue, 25 Oct 2011 19:43:33 GMT</pubDate></item><item><title><![CDATA[Reply to Matrizen aus Datei parsen mit Variablen on Tue, 25 Oct 2011 19:55:48 GMT]]></title><description><![CDATA[<p>Ich habe schon was zu Grammatiken gelesen, damit habe ich vor die einzelnen ausdrücke zu parsen nachdem diverse splits und ähnliches angewendet sind. Alles andere lässt sich meiner meinung nach aber recht gut mit handgefrickel machen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
Ich hätte aber schon interesse mir die Themen Syntaxanalyse &amp; co mal näher anzusehen, weiß nur nicht genau ob ich da so bald zu komme.<br />
Kennst du denn was gutes zum lesen (am besten online)?</p>
<p>Und das immer mehr von Matlab gefordert wird glaube ich eher nicht und wenn doch habe ich kein Problem damit, da ich die Sache mit dem Parsing und co interessant finde und dann noch mehr Zeit darauf verwenden kann, mir das anzugucken.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2135790</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2135790</guid><dc:creator><![CDATA[*Q* 1]]></dc:creator><pubDate>Tue, 25 Oct 2011 19:55:48 GMT</pubDate></item><item><title><![CDATA[Reply to Matrizen aus Datei parsen mit Variablen on Tue, 25 Oct 2011 21:02:55 GMT]]></title><description><![CDATA[<p>Hallo Q,</p>
<p>schaue Dir mal <a href="http://www.c-plusplus.net/forum/278281" rel="nofollow">diesen Thread (Zeilen einlesen, Parameter speichern und später verwenden)</a> an. Dort sind bereits wesentliche Elemente, von dem was Du benötigst, realisiert.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2135807</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2135807</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Tue, 25 Oct 2011 21:02:55 GMT</pubDate></item><item><title><![CDATA[Reply to Matrizen aus Datei parsen mit Variablen on Wed, 26 Oct 2011 09:33:52 GMT]]></title><description><![CDATA[<p>Hallo Werner, danke für den Link. Leider finde ich das was dort angewendet wird nicht sonderlich verständlich und ich wollte eigentlich möglichst viel selbst implementieren um dabei zu lernen.</p>
<p>Ich habe gerade eine TokenStream-Klasse geschrieben, die nach allen bisherigen Tests funktioniert.</p>
<p>Jetzt entwerfe ich gerade eine Ausdrucks-Grammatik, allerdings bin ich mir dabei ziemlich unsicher, weil ich sowas noch nie gemacht hab.<br />
Hier ist mein derzeitiger Entwurf:</p>
<pre><code>Definition:
   Variable
   Matrix
Variable:
   Variable-name &quot;=&quot; Number &quot;;&quot;
Matrix:
   Variable-name &quot;=&quot; Matrix-Definition &quot;;&quot;
Matrix-Definition:
   &quot;[&quot; Rows &quot;]&quot;
Rows:
   Row    
   Rows &quot;;&quot; Row
Row:
   Expression
   Row &quot;,&quot; Expression
Variable-name:
   string-literal containing only alphanumerical characters and underscores
Expression:
   Term
   Expression &quot;+&quot; Term
   Expression &quot;-&quot; Term
Term:
   Primary
   Term &quot;*&quot; Primary
   Term &quot;/&quot; Primary
   &quot;-&quot; Primary
   &quot;+&quot; Primary
Primary:
   Number
   &quot;(&quot; Expression &quot;)&quot;
Number:
   floating-point-literal
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2135950</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2135950</guid><dc:creator><![CDATA[*Q* 1]]></dc:creator><pubDate>Wed, 26 Oct 2011 09:33:52 GMT</pubDate></item><item><title><![CDATA[Reply to Matrizen aus Datei parsen mit Variablen on Wed, 26 Oct 2011 11:26:08 GMT]]></title><description><![CDATA[<p>Was mir noch aufgefallen ist: Wenn ich den Token-Stream verwende, verliere ich Informationen über Zeilennummern und kann bei Fehlermeldungen nicht mehr auf eine solche verweisen...</p>
<p>Hat jemand eine Idee, wie ich das ändern kann? Ich könnte bei jedem Token eine Zeilennummer mitspeichern, allerdings würde das einlesen wesentlich schwieriger werden, wenn ich dauernd auf newline prüfen muss, denke ich...</p>
<p>Edit: Habs mit dem linecount jetzt doch hinbekommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2135994</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2135994</guid><dc:creator><![CDATA[*Q* 1]]></dc:creator><pubDate>Wed, 26 Oct 2011 11:26:08 GMT</pubDate></item><item><title><![CDATA[Reply to Matrizen aus Datei parsen mit Variablen on Wed, 26 Oct 2011 11:46:03 GMT]]></title><description><![CDATA[<p>Da du hier ja schon fast eine EBNF hast, könntest du dir boost::spirit mal ansehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2136052</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2136052</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Wed, 26 Oct 2011 11:46:03 GMT</pubDate></item><item><title><![CDATA[Reply to Matrizen aus Datei parsen mit Variablen on Wed, 26 Oct 2011 14:14:16 GMT]]></title><description><![CDATA[<p>Danke für den Tipp mit boost.<br />
Allerdings will das ganze ja erstmal versuchen selbst zu implementieren um mal zu lernen wie das so funktioniert. Wenn ich dann irgenwann etwas Erfahrung habe, dann schaue ich mir boost::spirit an.</p>
<p>Hier gerade nochmal eine Frage:<br />
Ich muss rausfinden, ob ich am Ende der Datei bin. Geht das wirklich nur so umständlich, oder gibts da nen besseren weg?</p>
<pre><code class="language-cpp">bool TokenStream::AtEnd()
{
	if(!buffer_.empty())
	{
		return false;
	}
	if(ifs_.eof())
	{
		return true;
	}
	char ch;
	ifs_ &gt;&gt; ch;
	if(ifs_.eof())
	{
		return true;
	}
	ifs_.putback(ch);
	return false;
}
</code></pre>
<p>Und dann noch eine Frage zu putback: Kann ich nur 1 char zurücktun, oder funktioniert das auch wenn ich mehrere hinteeinander zurücktue?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2136148</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2136148</guid><dc:creator><![CDATA[*Q* 1]]></dc:creator><pubDate>Wed, 26 Oct 2011 14:14:16 GMT</pubDate></item></channel></rss>