<?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[Matrix - Spalten vertauschen]]></title><description><![CDATA[<p>Alter Titel: Matrix als Argument - Anzahl der Zeilen und Spalten?</p>
<p>Hallo,</p>
<p>bin gerade dabei mir einen LGS-Solver zu basteln, der den Gauss-Jordan-Algorithmus benutzt. Wie auch immer ... jedenfalls habe ich mir eine float-Matrix folgendermaßen erstellt (z und s sind bekannt):</p>
<pre><code class="language-cpp">float** Matrix = CreateMatrix(z, s);
</code></pre>
<pre><code class="language-cpp">//CreateMatrix()-Declaration
float** CreateMatrix(int iRows, int iColumns)
{
	float** Matrix;
	Matrix = new float* [iRows];

	for(int i = 0; i &lt; iRows; i++)
	{
		Matrix[i] = new float [iColumns];
	}

	return Matrix;
}
</code></pre>
<p>Jetzt habe ich mir natürlich schon einige Funktionen gebastelt um die Matrix zu manipulieren usw. Dabei habe ich bisher immer die Matrix selbst und die Anzahl der Spalten und/oder Zeilen als Argumente übergeben. Beispielsweise bei dieser Funktion, welche den Spaß wieder aufräumt:</p>
<pre><code class="language-cpp">DeleteMatrix(Matrix, z);
</code></pre>
<pre><code class="language-cpp">//DeleteMatrix()-Declaration
void DeleteMatrix(float** Matrix, int iRows)
{
	for(int i = 0; i &lt; iRows; i++)
	{
		delete[] Matrix[i];
	}
	delete[] Matrix;

	return;
}
</code></pre>
<p>Da das auf Dauer recht nervig ist, wollte ich das jetzt ändern. Natürlich könnte man die Matrix in eine Struktur packen in der außerdem noch die Anzahl der Spalten und Zeilen gespeichert wird und dann immer die Struktur übergeben, da spricht sicher auch nix dagegen (habe ich hier im Forum schon gesehen (SuFu)). Trotzdem frage ich mich, ob es auch anders geht, mit sizeof() oder so vielleicht??? Ich wüsste jetzt nicht, wie.</p>
<p>MfG dust</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/212453/matrix-spalten-vertauschen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 14 Oct 2026 20:28:34 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/212453.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 06 May 2008 15:02:39 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Matrix - Spalten vertauschen on Tue, 06 May 2008 23:45:51 GMT]]></title><description><![CDATA[<p>Alter Titel: Matrix als Argument - Anzahl der Zeilen und Spalten?</p>
<p>Hallo,</p>
<p>bin gerade dabei mir einen LGS-Solver zu basteln, der den Gauss-Jordan-Algorithmus benutzt. Wie auch immer ... jedenfalls habe ich mir eine float-Matrix folgendermaßen erstellt (z und s sind bekannt):</p>
<pre><code class="language-cpp">float** Matrix = CreateMatrix(z, s);
</code></pre>
<pre><code class="language-cpp">//CreateMatrix()-Declaration
float** CreateMatrix(int iRows, int iColumns)
{
	float** Matrix;
	Matrix = new float* [iRows];

	for(int i = 0; i &lt; iRows; i++)
	{
		Matrix[i] = new float [iColumns];
	}

	return Matrix;
}
</code></pre>
<p>Jetzt habe ich mir natürlich schon einige Funktionen gebastelt um die Matrix zu manipulieren usw. Dabei habe ich bisher immer die Matrix selbst und die Anzahl der Spalten und/oder Zeilen als Argumente übergeben. Beispielsweise bei dieser Funktion, welche den Spaß wieder aufräumt:</p>
<pre><code class="language-cpp">DeleteMatrix(Matrix, z);
</code></pre>
<pre><code class="language-cpp">//DeleteMatrix()-Declaration
void DeleteMatrix(float** Matrix, int iRows)
{
	for(int i = 0; i &lt; iRows; i++)
	{
		delete[] Matrix[i];
	}
	delete[] Matrix;

	return;
}
</code></pre>
<p>Da das auf Dauer recht nervig ist, wollte ich das jetzt ändern. Natürlich könnte man die Matrix in eine Struktur packen in der außerdem noch die Anzahl der Spalten und Zeilen gespeichert wird und dann immer die Struktur übergeben, da spricht sicher auch nix dagegen (habe ich hier im Forum schon gesehen (SuFu)). Trotzdem frage ich mich, ob es auch anders geht, mit sizeof() oder so vielleicht??? Ich wüsste jetzt nicht, wie.</p>
<p>MfG dust</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1504290</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1504290</guid><dc:creator><![CDATA[dust]]></dc:creator><pubDate>Tue, 06 May 2008 23:45:51 GMT</pubDate></item><item><title><![CDATA[Reply to Matrix - Spalten vertauschen on Tue, 06 May 2008 15:07:16 GMT]]></title><description><![CDATA[<p>std::vector</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1504293</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1504293</guid><dc:creator><![CDATA[Don06]]></dc:creator><pubDate>Tue, 06 May 2008 15:07:16 GMT</pubDate></item><item><title><![CDATA[Reply to Matrix - Spalten vertauschen on Tue, 06 May 2008 15:19:13 GMT]]></title><description><![CDATA[<p>ok, hab bei google gleich was Gutes gefunden zu &quot;vector&quot;... schau ich mir mal an ...</p>
<p>ich formuliere meine Frage um: Kann ich mittels sizeof() die Anzahl der Zeilen bzw. Spalten (sprich: Array-Range) herausfinden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1504298</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1504298</guid><dc:creator><![CDATA[dust]]></dc:creator><pubDate>Tue, 06 May 2008 15:19:13 GMT</pubDate></item><item><title><![CDATA[Reply to Matrix - Spalten vertauschen on Tue, 06 May 2008 15:52:46 GMT]]></title><description><![CDATA[<p>dust schrieb:</p>
<blockquote>
<p>ich formuliere meine Frage um: Kann ich mittels sizeof() die Anzahl der Zeilen bzw. Spalten (sprich: Array-Range) herausfinden?</p>
</blockquote>
<p>Nicht bei deinen dynamisch allokierten Arrays, denn das sind im Grunde nur Zeiger.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1504314</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1504314</guid><dc:creator><![CDATA[this-*gt*that]]></dc:creator><pubDate>Tue, 06 May 2008 15:52:46 GMT</pubDate></item><item><title><![CDATA[Reply to Matrix - Spalten vertauschen on Tue, 06 May 2008 16:04:23 GMT]]></title><description><![CDATA[<p>Danke euch!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1504325</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1504325</guid><dc:creator><![CDATA[dust]]></dc:creator><pubDate>Tue, 06 May 2008 16:04:23 GMT</pubDate></item><item><title><![CDATA[Reply to Matrix - Spalten vertauschen on Tue, 06 May 2008 23:55:42 GMT]]></title><description><![CDATA[<p>Hallo, ich habe folgende Funktion geschrieben, die 2 Spalten einer Matrix vertauschen soll, allerdings bekomme ich in der 8. Zeile (temp = ...) einen Fehler während der Laufzeit, aus dem Debuggen werde ich nicht schlau. Was mache ich falsch? Denkfehler oder gehe ich mit den Pointern falsch um?</p>
<pre><code class="language-cpp">//Aufruf in main(), natürlich hat die Matrix &gt;= 3 Zeilen und die erste und zweite Spalte existieren auch
SwapColumns(&amp;Matrix, 3, 1, 2);
</code></pre>
<pre><code class="language-cpp">//SwapColumns()-Declaration
void SwapColumns(float*** Matrix, int iRows, int i1stColumn, int i2ndColumn)
{
	float temp;

	for (int i = 0; i &lt; iRows; i++)
	{
		temp = *(Matrix[i][i1stColumn - 1]);
		*(Matrix[i][i1stColumn - 1]) = *(Matrix[i][i2ndColumn - 1]);
		*(Matrix[i][i2ndColumn - 1]) = temp;
	}
	return;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1504595</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1504595</guid><dc:creator><![CDATA[dust]]></dc:creator><pubDate>Tue, 06 May 2008 23:55:42 GMT</pubDate></item><item><title><![CDATA[Reply to Matrix - Spalten vertauschen on Wed, 07 May 2008 17:38:16 GMT]]></title><description><![CDATA[<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /> push</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1505050</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1505050</guid><dc:creator><![CDATA[dust]]></dc:creator><pubDate>Wed, 07 May 2008 17:38:16 GMT</pubDate></item><item><title><![CDATA[Reply to Matrix - Spalten vertauschen on Wed, 07 May 2008 18:58:49 GMT]]></title><description><![CDATA[<p>a) Benutze std::swap für den Dreieckstausch<br />
b) übergib ein float** und greife mit Matrix[i][j] auf die Elemente zu. Ansonsten: (*Matrix)[i][j]. Den Pointer-Kram solltest Du nochmal genau anschauen. Besser ist möglichst wenig mit blanken Pointern zu fummeln <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="😉"
    /> .<br />
c) return ohne Rückgabewert sparst Du Dir besser am Ende einer Funktion. Ist unnötig.<br />
d) weitere Tips zu Deinem Vorhaben: Du könntest eine weitere Indirektion über eine Permutation einführen und Dir damit das umkopieren komplett sparen. Und ausserdem kannst Du den Speicher auch am Stück anfordern und Dir die Positionen umrechnen bzw. über ein Proxy-Objekt einen operator[][] &quot;bauen&quot;. Erstmal würde ich den Matrix-Kram sowieso in eine Klasse packen.<br />
e) Du könntest die Matrix auch spaltenweise anfordern und dann einfach mit std::swap(Matrix[i], Matrix[j]) die Spalten tauschen, indem Du einfach die Pointer &quot;swappst&quot;.</p>
<p>Zu Deinem Code oben:</p>
<pre><code class="language-cpp">void SwapColumns(float*** Matrix, int iRows, int i1stColumn, int i2ndColumn) 
{    
    for (int i = 0; i &lt; iRows; i++) 
        std::swap((*Matrix)[i][i1stColumn - 1], (*Matrix)[i][i2ndColumn - 1]); 
}
</code></pre>
<p>sollte eigentlich funktionieren <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="😉"
    /> . Du musst evtl. noch &quot;#include &lt;algorithm&gt;&quot; in den Dateikopf einfügen.</p>
<p>Das hier</p>
<pre><code class="language-cpp">void SwapColumns(float** Matrix, int iRows, int i1stColumn, int i2ndColumn) 
{    
    for (int i = 0; i &lt; iRows; i++) 
        std::swap(Matrix[i][i1stColumn], Matrix[i][i2ndColumn]); 
}
</code></pre>
<p>finde ich persönlich aber besser. Der Dreifach-Pointer ist hier unnötig und die Indizierung in C++ beginnt im Gegensatz zu Fortran, Matlab und Co. mit 0. Daran halten sich auch die meisten darauf aufbauenden Libraries. Aber das ist eher Geschmackssache. Manche Libraries lassen einem auch die Wahl ob nun 0 oder 1 das erste Element in einem Array-Datentyp sein soll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1505091</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1505091</guid><dc:creator><![CDATA[Walli]]></dc:creator><pubDate>Wed, 07 May 2008 18:58:49 GMT</pubDate></item></channel></rss>