<?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[Operatoren für Matrix-Rechnungen überladen]]></title><description><![CDATA[<p>Hallo zusammen,<br />
google kann mir ausnahmsweise mal nicht helfen, bzw. ich komm mit den google-Lösungen nicht weiter.<br />
Ich schreibe gerade eine Matrix-Klasse und möchte gerne folgendes ermöglichen:</p>
<p>Matrix A(m,n); //m x n Matrix<br />
//Matrix A mit Werten füllen<br />
Matrix B(m,n);<br />
B=A+A;</p>
<p>Mein bisheriger Code sieht wie folgt aus, ich würde mich freuen, wenn sich das einer angucken würde:</p>
<pre><code class="language-cpp">Matrix::Matrix(unsigned int m_, unsigned int n_):m(m_),n(n_)
{
	unsigned int i,j;

	daten = new int*[m];
	for(i=0; i&lt;m; i++){
		daten[i] = new int[n];
		for(j=0; j&lt;n; j++)
			daten[i][j] = 0;
	}
}

Matrix::~Matrix(){
	unsigned int i;

	for(i=0; i&lt;m; i++){
		delete daten[i];
	}
	delete daten;
}

Matrix Matrix::operator+(const Matrix&amp; A){

	Matrix Tmp(m,n);
	unsigned int i,j;
	for(i=0; i&lt;m; i++){
		for(j=0; j&lt;n; j++){
			Tmp.daten[i][j] = daten[i][j] + A.daten[i][j];
		}
	}
	return Tmp;
}

Matrix&amp; Matrix::operator =(const Matrix&amp; A){

	unsigned int i,j;
	for(i=0; i&lt;m; i++){
		for(j=0; j&lt;n; j++){
			daten[i][j] = A.daten[i][j];
		}
	}
	return *this;
}
</code></pre>
<p>Damit ist mein Ziel aber nicht erreichbar. Es gibt keine Fehlermeldung, aber es entweder stürzt das Programm ab (vermutlich beim destructor) oder es stehen zufällige Werte im Ergebnis.<br />
D.h. ich vermute, ich behandel meinen Speicher falsch <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>
<p>Gruß,<br />
wetho</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/275469/operatoren-für-matrix-rechnungen-überladen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 26 Aug 2026 14:51:32 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/275469.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 15 Oct 2010 07:06:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Operatoren für Matrix-Rechnungen überladen on Fri, 15 Oct 2010 07:06:00 GMT]]></title><description><![CDATA[<p>Hallo zusammen,<br />
google kann mir ausnahmsweise mal nicht helfen, bzw. ich komm mit den google-Lösungen nicht weiter.<br />
Ich schreibe gerade eine Matrix-Klasse und möchte gerne folgendes ermöglichen:</p>
<p>Matrix A(m,n); //m x n Matrix<br />
//Matrix A mit Werten füllen<br />
Matrix B(m,n);<br />
B=A+A;</p>
<p>Mein bisheriger Code sieht wie folgt aus, ich würde mich freuen, wenn sich das einer angucken würde:</p>
<pre><code class="language-cpp">Matrix::Matrix(unsigned int m_, unsigned int n_):m(m_),n(n_)
{
	unsigned int i,j;

	daten = new int*[m];
	for(i=0; i&lt;m; i++){
		daten[i] = new int[n];
		for(j=0; j&lt;n; j++)
			daten[i][j] = 0;
	}
}

Matrix::~Matrix(){
	unsigned int i;

	for(i=0; i&lt;m; i++){
		delete daten[i];
	}
	delete daten;
}

Matrix Matrix::operator+(const Matrix&amp; A){

	Matrix Tmp(m,n);
	unsigned int i,j;
	for(i=0; i&lt;m; i++){
		for(j=0; j&lt;n; j++){
			Tmp.daten[i][j] = daten[i][j] + A.daten[i][j];
		}
	}
	return Tmp;
}

Matrix&amp; Matrix::operator =(const Matrix&amp; A){

	unsigned int i,j;
	for(i=0; i&lt;m; i++){
		for(j=0; j&lt;n; j++){
			daten[i][j] = A.daten[i][j];
		}
	}
	return *this;
}
</code></pre>
<p>Damit ist mein Ziel aber nicht erreichbar. Es gibt keine Fehlermeldung, aber es entweder stürzt das Programm ab (vermutlich beim destructor) oder es stehen zufällige Werte im Ergebnis.<br />
D.h. ich vermute, ich behandel meinen Speicher falsch <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>
<p>Gruß,<br />
wetho</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1965934</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1965934</guid><dc:creator><![CDATA[wetho]]></dc:creator><pubDate>Fri, 15 Oct 2010 07:06:00 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren für Matrix-Rechnungen überladen on Fri, 15 Oct 2010 07:17:40 GMT]]></title><description><![CDATA[<p>Zumindest solltest du aus &quot;delete&quot; &quot;delete[]&quot; machen.</p>
<p>Drehleiter</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1965937</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1965937</guid><dc:creator><![CDATA[Drehleiter]]></dc:creator><pubDate>Fri, 15 Oct 2010 07:17:40 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren für Matrix-Rechnungen überladen on Fri, 15 Oct 2010 07:24:02 GMT]]></title><description><![CDATA[<p>Gibt es einen speziellen Grund, warum du nicht so etwas wie vector für die Daten nimmst?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1965941</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1965941</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 15 Oct 2010 07:24:02 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren für Matrix-Rechnungen überladen on Fri, 15 Oct 2010 07:28:54 GMT]]></title><description><![CDATA[<p>Weiterhin wird ein CopyKonstruktor benötigt.<br />
Die beiden gezeigten Operatoren funktionieren ja auch nur wenn beide Matrizen gleich groß sind.<br />
Das ist beim operator+ ja auch nötig, beim Zuweisungsoperator aber nicht (wenn man ihn anders designt).<br />
Ich würde den operator+ auch noch zu einer globalen Funktion machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1965944</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1965944</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Fri, 15 Oct 2010 07:28:54 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren für Matrix-Rechnungen überladen on Fri, 15 Oct 2010 07:29:14 GMT]]></title><description><![CDATA[<p>Erstmal danke an Drehleiter, da hast du natürlich Recht^^<br />
<a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/19375">@SeppJ</a>: Nee, gibts nicht, ich hab einfach nicht dran gedacht, aber kann man mein Vorhaben denn auch mit meinem Array-Kram realisieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1965945</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1965945</guid><dc:creator><![CDATA[wetho]]></dc:creator><pubDate>Fri, 15 Oct 2010 07:29:14 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren für Matrix-Rechnungen überladen on Fri, 15 Oct 2010 07:31:33 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/1387">@Braunstein</a>: Den Fall unterschiedlicher Größen hab ich erstmal per Fehlerabfrage aussortiert... Oder brauch ich den CopyConstructor auch, wenn man von gleichgroßen Matrizen ausgehen kann?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1965947</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1965947</guid><dc:creator><![CDATA[wetho]]></dc:creator><pubDate>Fri, 15 Oct 2010 07:31:33 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren für Matrix-Rechnungen überladen on Fri, 15 Oct 2010 07:39:08 GMT]]></title><description><![CDATA[<p>wetho schrieb:</p>
<blockquote>
<p>aber kann man mein Vorhaben denn auch mit meinem Array-Kram realisieren?</p>
</blockquote>
<p>Ja. Eigentlich sieht es auch gar nicht so verkehrt aus bis auf den fehlenden Copy-Konstruktor und das delete ohne [].</p>
<p>wetho schrieb:</p>
<blockquote>
<p>Oder brauch ich den CopyConstructor auch, wenn man von gleichgroßen Matrizen ausgehen kann?</p>
</blockquote>
<p>Den brauchst du immer. Google mal nach der Regel der großem Drei.</p>
<p>Wenn du es ein bisschen abstrakter haben willst: Du könntest ein Matrixtemplate machen, bei dem die Größe ein Templateparameter ist. Eine Matrix sollte ihre Größe schließlich nicht selber ändern können. Dann übernimmt der Compiler für dich die Prüfung ob die Größen passen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1965952</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1965952</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 15 Oct 2010 07:39:08 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren für Matrix-Rechnungen überladen on Fri, 15 Oct 2010 07:57:29 GMT]]></title><description><![CDATA[<p>wetho schrieb:</p>
<blockquote>
<p>Matrix A(m,n); //m x n Matrix<br />
//Matrix A mit Werten füllen<br />
Matrix B(m,n);<br />
B=A+A;</p>
</blockquote>
<p>Das ist ein schönes Beispiel für &quot;Wie man es nicht machen sollte&quot;.<br />
<em>So</em> sollte das aussehen:</p>
<pre><code class="language-cpp">Matrix A(m,n);  //m x n Matrix
//Matrix A mit Werten füllen
Matrix B = A+A;
</code></pre>
<p>Dies spart typischerweise unnötiges Kopieren.<br />
Ich kann übrigens <a href="http://www.boost.org/doc/libs/1_44_0/libs/numeric/ublas/doc/index.htm" rel="nofollow">Boost.uBLAS</a> empfehlen. Es dauert aber eine Weile, bis man sich damit zurecht findet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1965960</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1965960</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Fri, 15 Oct 2010 07:57:29 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren für Matrix-Rechnungen überladen on Fri, 15 Oct 2010 12:28:51 GMT]]></title><description><![CDATA[<blockquote>
<p>Wenn du es ein bisschen abstrakter haben willst: Du könntest ein Matrixtemplate machen, bei dem die Größe ein Templateparameter ist. Eine Matrix sollte ihre Größe schließlich nicht selber ändern können. Dann übernimmt der Compiler für dich die Prüfung ob die Größen passen.</p>
</blockquote>
<p>Vor allem entfällt dann das dynamische Anfordern von Speicher:</p>
<pre><code class="language-cpp">template&lt;int n, int m,typename T=int&gt;
class Matrix{
     T[n][m];     
     // usw...
};

Matrix&lt;4,4&gt; m;     // find ich persönlich schöner als Matrix m(4,4)
Matrix&lt;2,2,float&gt; m;
</code></pre>
<p>Zumeist sind die Dimensionen der Matrix schon zur Compilezeit bekannt. Von daher ist diese Variante womöglich besser geeignet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1966055</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1966055</guid><dc:creator><![CDATA[Matrixler]]></dc:creator><pubDate>Fri, 15 Oct 2010 12:28:51 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren für Matrix-Rechnungen überladen on Sat, 16 Oct 2010 19:50:05 GMT]]></title><description><![CDATA[<p>Guten Abend!</p>
<p>Vielen Dank für die Antworten, ich werd' mal sehen, wie ich damit umgehen werde. Ich werd' mich dann nochmal melden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1966539</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1966539</guid><dc:creator><![CDATA[wetho]]></dc:creator><pubDate>Sat, 16 Oct 2010 19:50:05 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren für Matrix-Rechnungen überladen on Fri, 22 Oct 2010 16:28:02 GMT]]></title><description><![CDATA[<p>Hab mich letztendlich für folgende Lösung entschieden:<br />
(mit copy-Konstruktor und nicht mit Templates realisiert)</p>
<pre><code class="language-cpp">Matrix::Matrix(unsigned int rows_, unsigned int columns_)
:rows(rows_),columns(columns_)
{
	unsigned int i,j;

	daten = new double*[rows];
	for(i=0; i&lt;rows; i++){
		daten[i] = new double[columns];
		for(j=0; j&lt;columns; j++)
			daten[i][j] = 0;
	}
}

Matrix::Matrix(const Matrix&amp; A):rows(A.rows),columns(A.columns)
{
	unsigned int i,j;

	daten = new double*[rows];
	for(i=0; i&lt;rows; i++){
		daten[i] = new double[columns];
		for(j=0; j&lt;columns; j++){
			daten[i][j] = A.daten[i][j];
		}
	}
}

Matrix::~Matrix(){
	unsigned int i;

	for(i=0; i&lt;rows; i++){
		delete[] daten[i];
	}
	delete daten;
}

Matrix Matrix::operator+(const Matrix&amp; A) const{
	if(rows!=A.rows || columns!=A.columns){
		cout &lt;&lt; &quot;Fehler bei Matrixaddition&quot;;
		return *this;
	}

	Matrix Tmp(rows,columns);
	unsigned int i,j;
	for(i=0; i&lt;rows; i++){
		for(j=0; j&lt;columns; j++){
			Tmp.daten[i][j] = daten[i][j] + A.daten[i][j];
		}
	}
	return Tmp;
}

Matrix Matrix::operator*(const Matrix&amp; A) const{
	if(columns!=A.rows){
		cout &lt;&lt; &quot;Fehler bei Matrixmultiplikation&quot;;
		return *this;
	}

	unsigned int i,j,k;
	double tmpsum;

	Matrix Tmp(rows,A.columns);
	for(i=0; i&lt;rows; i++){
		for(j=0; j&lt;A.columns; j++){
			tmpsum = 0;
			for(k=0; k&lt;columns; k++){
				tmpsum += daten[i][k]*A.daten[k][j];
			}
			Tmp.daten[i][j] = tmpsum;
		}
	}
	return Tmp;
}

void Matrix::operator =(const Matrix&amp; A) {
	unsigned int i,j;
	if (rows != 0) {
		for (i=0; i&lt;rows; i++) {
			delete [] daten[i];}
		delete [] daten;
	}
	rows = A.rows;
	columns = A.columns;
	daten = new double*[rows];
	for (i=0; i&lt;rows; i++) {
		daten[i] = new double[columns];
		for (j=0; j&lt;columns; j++)
			daten[i][j] = A.daten[i][j];
	}
}
</code></pre>
<p>Danke nochmal für die Hilfe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1969206</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1969206</guid><dc:creator><![CDATA[wetho]]></dc:creator><pubDate>Fri, 22 Oct 2010 16:28:02 GMT</pubDate></item></channel></rss>