<?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-Klasse]]></title><description><![CDATA[<p>Hi,</p>
<p>ich soll als Projekt eine Klasse schreiben, die das Rechnen mit Matrizen ermöglicht.<br />
Zuerst hab ich eine Klasse etwickelt, bei der die einzelnen Elemente jeweils aus aus einem 2dim. Feld der Länge 10 bestehen, plus die Attribute Zeilen, Spalten:</p>
<pre><code class="language-cpp">class Matrix
{
    private:
    int a[10][10];
    int Zeilen, Spalten;

    public:
    Matrix(int, int);
...
};

Matrix::Matrix(int m=10, int n=10)
{
    Zeilen=m;
    Spalten=n;
    for (int i=0; i&lt;m; i++)
    {
        for (int j=0; j&lt;n; j++)
        {
            a[i][j]=0;
        }
    }
}
...
</code></pre>
<p>Nun hab ich mir gedacht, wär ja auch schön, wenn ich eine allgemeine N X M Matrix hätte, die nicht durch 10 X 10 beschränkt ist:</p>
<pre><code class="language-cpp">class Matrix
{
    private:
    double** a;
    int Zeilen;
    int Spalten;

    public:
    Matrix (int, int);
    ~Matrix ();
...
};

Matrix :: Matrix (int M, int N)
{
    Zeilen=M;
    Spalten=N;
    double** a = new double* [M]; \\Feld von Zeigern der Dim. M
    for (int i=0; i&lt;M; i++)
    {
        a[i] = new double [N]; \\Zeiger auf Feld vom Typ Double der Dim. N
        for (int j=0; j&lt;N; j++)
            {
                a[i][j]=0;
            }
    }
    cout &lt;&lt; &quot;\n Konstruktor\n&quot;;
}

Matrix :: ~Matrix ()
{
    for (int i=0; i&lt;Zeilen; i++)
    {
        delete [] a[i];
    }
    delete [] a;
    cout &lt;&lt; &quot;\n Destruktor\n&quot;;
}

...
</code></pre>
<p>Das Problem ist jetzt, sobald ich af die einzelnen Matrix-Elemente per Methode zugreife z.B a[i][j]=1; , stürtzt mein Programm ab. Im Konstruktor werden die Elemente aber ohne Probleme mit Nullen beschrieben.<br />
Was zür Hölle hab ich hier falsch gemacht?</p>
<p>Ich hoffe mal ihr könnt mir helfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/243565/matrizen-klasse</link><generator>RSS for Node</generator><lastBuildDate>Sun, 20 Sep 2026 00:33:16 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/243565.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 18 Jun 2009 12:14:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Matrizen-Klasse on Thu, 18 Jun 2009 12:14:00 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich soll als Projekt eine Klasse schreiben, die das Rechnen mit Matrizen ermöglicht.<br />
Zuerst hab ich eine Klasse etwickelt, bei der die einzelnen Elemente jeweils aus aus einem 2dim. Feld der Länge 10 bestehen, plus die Attribute Zeilen, Spalten:</p>
<pre><code class="language-cpp">class Matrix
{
    private:
    int a[10][10];
    int Zeilen, Spalten;

    public:
    Matrix(int, int);
...
};

Matrix::Matrix(int m=10, int n=10)
{
    Zeilen=m;
    Spalten=n;
    for (int i=0; i&lt;m; i++)
    {
        for (int j=0; j&lt;n; j++)
        {
            a[i][j]=0;
        }
    }
}
...
</code></pre>
<p>Nun hab ich mir gedacht, wär ja auch schön, wenn ich eine allgemeine N X M Matrix hätte, die nicht durch 10 X 10 beschränkt ist:</p>
<pre><code class="language-cpp">class Matrix
{
    private:
    double** a;
    int Zeilen;
    int Spalten;

    public:
    Matrix (int, int);
    ~Matrix ();
...
};

Matrix :: Matrix (int M, int N)
{
    Zeilen=M;
    Spalten=N;
    double** a = new double* [M]; \\Feld von Zeigern der Dim. M
    for (int i=0; i&lt;M; i++)
    {
        a[i] = new double [N]; \\Zeiger auf Feld vom Typ Double der Dim. N
        for (int j=0; j&lt;N; j++)
            {
                a[i][j]=0;
            }
    }
    cout &lt;&lt; &quot;\n Konstruktor\n&quot;;
}

Matrix :: ~Matrix ()
{
    for (int i=0; i&lt;Zeilen; i++)
    {
        delete [] a[i];
    }
    delete [] a;
    cout &lt;&lt; &quot;\n Destruktor\n&quot;;
}

...
</code></pre>
<p>Das Problem ist jetzt, sobald ich af die einzelnen Matrix-Elemente per Methode zugreife z.B a[i][j]=1; , stürtzt mein Programm ab. Im Konstruktor werden die Elemente aber ohne Probleme mit Nullen beschrieben.<br />
Was zür Hölle hab ich hier falsch gemacht?</p>
<p>Ich hoffe mal ihr könnt mir helfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1728775</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1728775</guid><dc:creator><![CDATA[schmitzlipp]]></dc:creator><pubDate>Thu, 18 Jun 2009 12:14:00 GMT</pubDate></item><item><title><![CDATA[Reply to Matrizen-Klasse on Thu, 18 Jun 2009 12:43:24 GMT]]></title><description><![CDATA[<p>Wie wärs eigentlich mit:</p>
<pre><code class="language-cpp">Matrix :: Matrix (int M, int N) 
:   Zeilen(M), Spalten(N)
{
/*  double** */ //wenn du wieder nen fehler haben willst, auskommentieren ;D
    a = new double* [M]; \\Feld von Zeigern der Dim. M 
    for (int i=0; i&lt;M; i++) 
    { 
        a[i] = new double [N]; \\Zeiger auf Feld vom Typ Double der Dim. N 
        for (int j=0; j&lt;N; j++) 
        { 
            a[i][j]=0; 
        } 
    } 
    cout &lt;&lt; &quot;\n Konstruktor\n&quot;; 
}
</code></pre>
<p>was spricht eigtl ggn<br />
<code>a = new doube[M*N]</code> ?</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1728798</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1728798</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Thu, 18 Jun 2009 12:43:24 GMT</pubDate></item><item><title><![CDATA[Reply to Matrizen-Klasse on Thu, 18 Jun 2009 12:55:38 GMT]]></title><description><![CDATA[<p>Es spricht eigentlich nix dagegen, aber ich hatte schon mal ein ähnliches Programm (ohne Klassen) geschrieben, in dem ich so gemacht hatte.</p>
<p>Jedenfalls danke für die schnelle Hilfe.<br />
Ich hab ech nicht bedacht, dass ich ja oben in der Klassendefiniton schon a vom Typ double ** definiert hatte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1728816</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1728816</guid><dc:creator><![CDATA[schmizlipp]]></dc:creator><pubDate>Thu, 18 Jun 2009 12:55:38 GMT</pubDate></item><item><title><![CDATA[Reply to Matrizen-Klasse on Thu, 18 Jun 2009 13:01:34 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Folgend eine schönere Implementierung. Der Ansatz greift auf die Container der STL zurück, um das Rad nicht neu zu erfinden. Somit ist die Matrix nichts anderes als ein Vektor von einem Vektor. Die Hilfsklasse MatrixVector wurde erstellt, damit der Benutzer der Klasse nicht den internen Zustand verändern kann, aber trotzdem die Index-Schreibweise verwenden kann.</p>
<pre><code class="language-cpp">class Matrix;

template&lt;typename T&gt;
class MatrixVector : private std::vector&lt;T&gt; 
{
	friend class Matrix;

public:
	explicit MatrixVector()
	 : std::vector&lt;T&gt;()
	{ }

	MatrixVector(unsigned int size, const T&amp; rhs)
	 : std::vector&lt;T&gt;(size, rhs)
	{ }

	std::vector&lt;T&gt;::reference operator[](unsigned int rhs) 
	{
		return std::vector&lt;T&gt;::operator[](rhs);
	}

	std::vector&lt;T&gt;::const_reference operator[](unsigned int rhs) 
	{
		return std::vector&lt;T&gt;::operator[](rhs);
	}

};

template&lt;typename T&gt;
class Matrix 
{
public:
	/*
	 * Die Konstruktoren. 
	 */
	Matrix() 
	 : pRows(0), pColumns(0)
	{ }

	Matrix(const Matrix&amp; other)
	 : pElements(other.pElements), pRows(other.pRows), pColumns(other.pColumns)
	{ }

	Matrix(unsigned int rows, unsigned int columns, const T&amp; rhs=T()) 
	{
		resize(rows, columns, rhs);
	}

	// Ein Konstruktor, der die Matrix aus einem Teil einer anderen Matrix erzeugt. 
	Matrix(const Matrix&amp; other, unsigned int rowBegin, unsigned int columnEnd, unsigned int rows, unsigned int columns)
	{
		resize(rows, columns);
		for(int r=0; r&lt;rows; ++r)
			for(int c=0; c&lt;columns; ++c)
				pElements[r][c] = other.pElements[r+rowBegin][c+columnBegin]
	}

	/*
	 * Zuweisungsoperator. 
	 */
	Matrix&amp; operator=(const Matrix&amp; other) 
	{
		if(this != &amp;other)
		{
			pElements = other.pElements;
			pRows = other.rows;
			pColumns = other.columns;
		}
		return *this;
	}

	/*
	 * Indexoperatoren. 
	 */
	MatrixVector&lt;T&gt;&amp; operator[](unsigned int rhs) 
	{
		return pElements[rhs];
	}

	const MatrixVector&lt;T&gt;&amp; operator[](unsigned int rhs) const 
	{
		return pElements[rhs];
	}

	/*
	 * Die resize()-Methode: Anpassung der Größe der Matrix. 
	 */
	void resize(unsigned int rows, unsigned int columns, const T&amp; rhs=T())
	{
		// Anpassung des Zeilenvektors. 
		pElements.resize(rows, MatrixVector&lt;T&gt;(columns, rhs));

		// Anpassung des Spaltenvektors. 
		for(int i=0; i&lt;rows; ++i)
			pElements[i].resize(columns, rhs);

		pColumns = columns;
		pRows = rows;
	}

	unsigned int rows() const 
	{
		return pRows;
	}

	unsigned int columns() const 
	{
		return pColumns;
	}

	unsigned int size() const
	{
		return pSize;
	}

};
</code></pre>
<p>Wenn man das jetzt richtig fein machen wollte, könnte man natürlich auch noch Iteratoren (row_iterator, column_iterator und die entsprechende Gegenstücke mit dem const_ davor).</p>
<p>Niels</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1728824</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1728824</guid><dc:creator><![CDATA[nielsp]]></dc:creator><pubDate>Thu, 18 Jun 2009 13:01:34 GMT</pubDate></item></channel></rss>