<?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[Klassentemplate fuer Matrizen, Spezialisierung fuer quadratische Matrizen]]></title><description><![CDATA[<p>Ich habe ein Matrixtemplate, dass durch Typ und Dimension parametrisiert wird:</p>
<pre><code class="language-cpp">template&lt;typename T, int r, int c&gt;
class Matrix { ..
</code></pre>
<p>Sie implementiert beispielsweise die Matrixmultiplikation typsicher.</p>
<ol>
<li>Manche Operationen wie <code>operator*=(..)</code> oder <code>diag()</code> (Matrix mit Diagonalelementen zurueckgeben) machen nur Sinn im Zusammenhang fuer quadratische Matrizen. Dabei gibt es verschiedene Moeglichkeiten:<br />
a)</li>
</ol>
<pre><code class="language-cpp">Matrix&lt;T,r,r&gt;&amp; operator*=(const Matrix&lt;T,r,r&gt;&amp; m);
</code></pre>
<p>b)</p>
<pre><code class="language-cpp">template&lt;typename T, int r, int c&gt;
Matrix&lt;T,r,c&gt;&amp; Matrix&lt;T,r,c&gt;::operator*=(const Matrix&lt;T,r,c&gt;&amp; m)
{
  static_assert(r == c, &quot;Matrix::operator*=(..): matrix has to be quadratic&quot;);
</code></pre>
<p>c)</p>
<pre><code class="language-cpp">template&lt;T,n&gt;
class QuadMatrix : public Matrix&lt;T,n,n&gt; { ..
</code></pre>
<p>Vererbung wollte ich nicht benutzen, da durch das Template sowieso immer ein neuer Typ angelegt wird. Zwischen a) und b) besteht prinzipiell nur ein Unterschied in der Fehlermeldung. Variante b) kann natuerlich weiter ausgebaut werden, indem die Parameter der zeiten Matrix ebenfalls frei gewaehlt werden um mittels <code>static_assert</code> eine bessere Fehlermeldung auszugeben. Ich habe mich fuer Variante b) entschieden, da die Fehlermeldung problembezogener ist. Das ist aber nicht die eigentliche vorgehensweise bei Templatespezialisierung. Welche Variante ist im Allgemeinen zu bevorzugen? Gibt es noch weitere?</p>
<ol start="2">
<li>Mit der Klasse sollen natuerlich auch lineare Gleichungssysteme der Form Ax = b geloest werden und die (eindeutige) Loesung in Form eines Spaltenvektors (Matrix&lt;T,r,1&gt;) zurueckgegeben werden. Auch hier soll es nur fuer quadratische Matrizen moeglich sein. Es gibt die Moeglichkeit a) das als Methode</li>
</ol>
<pre><code class="language-cpp">Matrix&lt;T,d,1&gt; solve(const Matrix&lt;T,d,1&gt;&amp; v) const
</code></pre>
<p>oder b) als freie Funktion</p>
<pre><code class="language-cpp">Matrix&lt;T,d,1&gt; solve(const Matrix&lt;T,r,c&gt;&amp; m, Matrix&lt;T,d,1&gt;)
</code></pre>
<p>zu implementieren. Auch hier kann mit den Moeglichkeiten aus 1.a) bzw. 1.b) die korrekten Matrixdimensionen sichergestellt werden.</p>
<p>Konkret: Soll <code>solve</code> als Methode oder freie Funktion implementiert werden? Welche Moeglich ist zu bevorzugen, wenn die korrekten Matrixdimensionen schon beim Uebersetzen sicherzustellen sind?</p>
<p>edit:<br />
Matrix.h: <a href="http://codepad.org/IZICoNH5" rel="nofollow">http://codepad.org/IZICoNH5</a><br />
Zero.h: <a href="http://codepad.org/WoYzH0oQ" rel="nofollow">http://codepad.org/WoYzH0oQ</a><br />
main.cpp: <a href="http://codepad.org/98JVUefU" rel="nofollow">http://codepad.org/98JVUefU</a></p>
<p>Uebersetzt mit g++ -std=c++0x main.cpp</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/291864/klassentemplate-fuer-matrizen-spezialisierung-fuer-quadratische-matrizen</link><generator>RSS for Node</generator><lastBuildDate>Mon, 17 Aug 2026 08:28:20 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/291864.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 29 Aug 2011 04:58:47 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Klassentemplate fuer Matrizen, Spezialisierung fuer quadratische Matrizen on Mon, 29 Aug 2011 05:18:20 GMT]]></title><description><![CDATA[<p>Ich habe ein Matrixtemplate, dass durch Typ und Dimension parametrisiert wird:</p>
<pre><code class="language-cpp">template&lt;typename T, int r, int c&gt;
class Matrix { ..
</code></pre>
<p>Sie implementiert beispielsweise die Matrixmultiplikation typsicher.</p>
<ol>
<li>Manche Operationen wie <code>operator*=(..)</code> oder <code>diag()</code> (Matrix mit Diagonalelementen zurueckgeben) machen nur Sinn im Zusammenhang fuer quadratische Matrizen. Dabei gibt es verschiedene Moeglichkeiten:<br />
a)</li>
</ol>
<pre><code class="language-cpp">Matrix&lt;T,r,r&gt;&amp; operator*=(const Matrix&lt;T,r,r&gt;&amp; m);
</code></pre>
<p>b)</p>
<pre><code class="language-cpp">template&lt;typename T, int r, int c&gt;
Matrix&lt;T,r,c&gt;&amp; Matrix&lt;T,r,c&gt;::operator*=(const Matrix&lt;T,r,c&gt;&amp; m)
{
  static_assert(r == c, &quot;Matrix::operator*=(..): matrix has to be quadratic&quot;);
</code></pre>
<p>c)</p>
<pre><code class="language-cpp">template&lt;T,n&gt;
class QuadMatrix : public Matrix&lt;T,n,n&gt; { ..
</code></pre>
<p>Vererbung wollte ich nicht benutzen, da durch das Template sowieso immer ein neuer Typ angelegt wird. Zwischen a) und b) besteht prinzipiell nur ein Unterschied in der Fehlermeldung. Variante b) kann natuerlich weiter ausgebaut werden, indem die Parameter der zeiten Matrix ebenfalls frei gewaehlt werden um mittels <code>static_assert</code> eine bessere Fehlermeldung auszugeben. Ich habe mich fuer Variante b) entschieden, da die Fehlermeldung problembezogener ist. Das ist aber nicht die eigentliche vorgehensweise bei Templatespezialisierung. Welche Variante ist im Allgemeinen zu bevorzugen? Gibt es noch weitere?</p>
<ol start="2">
<li>Mit der Klasse sollen natuerlich auch lineare Gleichungssysteme der Form Ax = b geloest werden und die (eindeutige) Loesung in Form eines Spaltenvektors (Matrix&lt;T,r,1&gt;) zurueckgegeben werden. Auch hier soll es nur fuer quadratische Matrizen moeglich sein. Es gibt die Moeglichkeit a) das als Methode</li>
</ol>
<pre><code class="language-cpp">Matrix&lt;T,d,1&gt; solve(const Matrix&lt;T,d,1&gt;&amp; v) const
</code></pre>
<p>oder b) als freie Funktion</p>
<pre><code class="language-cpp">Matrix&lt;T,d,1&gt; solve(const Matrix&lt;T,r,c&gt;&amp; m, Matrix&lt;T,d,1&gt;)
</code></pre>
<p>zu implementieren. Auch hier kann mit den Moeglichkeiten aus 1.a) bzw. 1.b) die korrekten Matrixdimensionen sichergestellt werden.</p>
<p>Konkret: Soll <code>solve</code> als Methode oder freie Funktion implementiert werden? Welche Moeglich ist zu bevorzugen, wenn die korrekten Matrixdimensionen schon beim Uebersetzen sicherzustellen sind?</p>
<p>edit:<br />
Matrix.h: <a href="http://codepad.org/IZICoNH5" rel="nofollow">http://codepad.org/IZICoNH5</a><br />
Zero.h: <a href="http://codepad.org/WoYzH0oQ" rel="nofollow">http://codepad.org/WoYzH0oQ</a><br />
main.cpp: <a href="http://codepad.org/98JVUefU" rel="nofollow">http://codepad.org/98JVUefU</a></p>
<p>Uebersetzt mit g++ -std=c++0x main.cpp</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2111847</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2111847</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 29 Aug 2011 05:18:20 GMT</pubDate></item><item><title><![CDATA[Reply to Klassentemplate fuer Matrizen, Spezialisierung fuer quadratische Matrizen on Mon, 29 Aug 2011 06:05:50 GMT]]></title><description><![CDATA[<p>bei 1) würde ich Methode 2 wählen, das gibt aussagekräftigere Fehlermeldungen.</p>
<p>bei 2) würde ich die freien FUnktionen wählen. Dies ist zum einen Konvention, zum anderen weil ich alle 3 teile von Solve als gleichberechtigt erachte. typischerweise wird solve aber als Funktion mit 3 Argumenten implementiert - hauptsächlich um die Kopie zu sparen. Könnte man aber auch mit einem expression-template lösen, falls dein System das kann.</p>
<p>Was sind denn die Anwendungsgebiete der Bibliothek? Spontan würde ich behaupten, dass feste Größen eher kleine Matrizen bedeutet?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2111856</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2111856</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Mon, 29 Aug 2011 06:05:50 GMT</pubDate></item><item><title><![CDATA[Reply to Klassentemplate fuer Matrizen, Spezialisierung fuer quadratische Matrizen on Mon, 29 Aug 2011 09:38:32 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<pre><code class="language-cpp">template&lt;T,n&gt;
class QuadMatrix : public Matrix&lt;T,n,n&gt;
</code></pre>
</blockquote>
<p>Im nächsten C++-Standard kannst du dafür <code>using</code> benutzen (Template-Aliases), allerdings weiss ich nicht, wie gut der Compilersupport dafür bereits ist.</p>
<p>knivil schrieb:</p>
<blockquote>
<p>Welche Variante ist im Allgemeinen zu bevorzugen? Gibt es noch weitere?</p>
</blockquote>
<p>Du könntest z.B. das Klassentemplate spezialisieren. Ob das besonders sinnvoll ist, hm. Jedenfalls hättest du Codeduplizierung (ein bisschen weniger, wenn du eine gemeinsame Basis verwendest).</p>
<pre><code class="language-cpp">template &lt;typename T, int R, int C&gt;
class Matrix
{
    ...
};

template &lt;typename T, int N&gt;
class Matrix&lt;T, N, N&gt;
{
    ...
};
</code></pre>
<p>otze schrieb:</p>
<blockquote>
<p>typischerweise wird solve aber als Funktion mit 3 Argumenten implementiert - hauptsächlich um die Kopie zu sparen. Könnte man aber auch mit einem expression-template lösen, falls dein System das kann.</p>
</blockquote>
<p>Am naheliegendsten wäre dafür wohl Move-Semantik, wenn knivil schon C++0x benutzt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2111938</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2111938</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 29 Aug 2011 09:38:32 GMT</pubDate></item><item><title><![CDATA[Reply to Klassentemplate fuer Matrizen, Spezialisierung fuer quadratische Matrizen on Tue, 30 Aug 2011 15:43:18 GMT]]></title><description><![CDATA[<p>Also: Ich spezialiesiere mit <code>static_assert</code> wegen der besseren Fehlermeldung und <code>solve</code> habe ich als freie Funktion implementiert (ok, LU-Zerlegung war dann doch besser). Template-Aliases werden leider vom g++ 4.7 noch nicht unterstuetzt. Danke fuer eure Antworten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2112591</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2112591</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Tue, 30 Aug 2011 15:43:18 GMT</pubDate></item><item><title><![CDATA[Reply to Klassentemplate fuer Matrizen, Spezialisierung fuer quadratische Matrizen on Tue, 30 Aug 2011 15:52:20 GMT]]></title><description><![CDATA[<p>Ich denke, man sollte in dem Zusammenhang unbedingt <a href="http://www.boost.org/doc/libs/1_47_0/libs/numeric/ublas/doc/index.htm" rel="nofollow">boost.uBLAS</a> erwähnen <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/2112596</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2112596</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Tue, 30 Aug 2011 15:52:20 GMT</pubDate></item><item><title><![CDATA[Reply to Klassentemplate fuer Matrizen, Spezialisierung fuer quadratische Matrizen on Tue, 30 Aug 2011 17:31:45 GMT]]></title><description><![CDATA[<p>dot schrieb:</p>
<blockquote>
<p>Ich denke, man sollte in dem Zusammenhang unbedingt <a href="http://www.boost.org/doc/libs/1_47_0/libs/numeric/ublas/doc/index.htm" rel="nofollow">boost.uBLAS</a> erwähnen <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>
</blockquote>
<p>naja, ich habs in meinem jetzigen Projekt verwendet und aktuell würde ich lieber Eigen verwenden. Ublas optimiert einfach das Falsche. In ublas ist nichtmal</p>
<pre><code class="language-cpp">A=prod(B,C)
</code></pre>
<p>fix. Faktor 2 langsamer als die handgeschriebene Schleife. Ja, ich hab das ausgemessen. Man muss das ekelhafte axpy_prod verwenden um schnell zu sein. Yeah, Syntax wie zu C-Zeiten. Und komplexere Ausdrücke wie:</p>
<pre><code class="language-cpp">A = prod(B,C+D+E)
</code></pre>
<p>fliegen einem komplett um die Ohren, insbesondere wenn man mal teureres als nur ne Addition hat.<br />
uBLAS ist definitiv kein Positivbeispiel für ein gutes LinAlg-Design.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/12954">@Nexus</a> nein, ein selbst evaluierender Kernel für die Berechnungen, der das Ergebnis direkt in den Ergebnisvektor schreibt ist hier wohl angesagt. Bei Matrizen dynamischer Größe hast du sonst den Allokationsoverhead und statische Arrays (und danach siehts mir hier aus) kannst du nicht gut verschieben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2112620</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2112620</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Tue, 30 Aug 2011 17:31:45 GMT</pubDate></item><item><title><![CDATA[Reply to Klassentemplate fuer Matrizen, Spezialisierung fuer quadratische Matrizen on Tue, 30 Aug 2011 18:34:44 GMT]]></title><description><![CDATA[<p>Ja, ich habe auch ueberlegt, Eigen oder MTL zu benutzen. Aber fuer meine einfachen Operationen, wollte ich keine ganze Library haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2112645</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2112645</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Tue, 30 Aug 2011 18:34:44 GMT</pubDate></item></channel></rss>