Seyphedias
Grünschnabel
also meine header-Datei:
dann noch meine cpp-datei:
C++:
#ifndef MATRIX
#define MATRIX
class matrix
{
private:
int zeilen,spalten;
static int anz;
double **Z; //Matrix mit Pointer auf Pointer
public:
matrix(int m=1, int n=1); //Standartkonstruktor
matrix (const matrix& A); //Copy-Konstruktor
~matrix(); //Destruktor
void show(); //Eine Matrix ausgeben
matrix transpose(); //Transponieren der matrix
void fill(); //Matrix mit Elementen füllen
matrix operator+ (const matrix& A); //Arithmetischer operator +
matrix operator- (const matrix& A); //Arithmetischer operator -
matrix operator* (const matrix& A); //Arithmetischer operator *
matrix operator= (const matrix& A); //Zuweisungsoperator
//double det(const matrix& A); //Determinante der Matrix
//double eigenwerte(const matrix& A); //Eigenwerte der Matrix
//matrix inverse(const matrix& A); //Inverse Matrix
};
#endif
dann noch meine cpp-datei:
C++:
#include <iostream>
#include "matrix.h"
using namespace std;
//Konstruktor
matrix::matrix(int m, int n) //Standardkonstruktor
{
zeilen=m;
spalten=n;
Z = new double* [zeilen];
for (int k = 0; k < zeilen; k++)
{
Z[k] = new double [spalten];
}
}
matrix::matrix(const matrix& A)
{
zeilen=A.zeilen;
spalten=A.spalten;
Z=new double* [zeilen];
for (int k = 0; k < zeilen; k++)
{
Z[k] = new double [spalten];
}
memcpy (Z, A.Z, (zeilen,spalten) * sizeof(double));
}
matrix::~matrix()
{
delete[] Z; //Speicher freigeben
}
void matrix::show()
{
for (int i = 0; i < zeilen; i++)
{
for (int k = 0; k < spalten; k++)
{
cout << Z[i][k]<<"\t";
}
cout<<endl;
}
}
void matrix::fill()
{
for (int i=0;i<zeilen;i++)
{
for (int k=0;k<spalten;k++)
{
cout<<"bitte geben Sie das Matrixelement "<<i+1<<","<<k+1<<" ein"<<endl;
cin>>Z[i][k];
}
}
}
//Arithmetische Operatoren
matrix matrix::operator= (const matrix& A)
{
zeilen=A.zeilen;
spalten=A.spalten;
if (Z != NULL)
{
delete[] Z; //Speicher freigeben bzw. altes Array löschen
}
Z=new double* [zeilen]; // neues in richtiger größe anlegen
for (int k = 0; k < zeilen; k++)
{
Z[k] = new double [spalten];
}
for (int i=0; i < zeilen; i++)
{
for(int k=0;k<spalten; k++)
{
Z[i][k]=A.Z[i][k];
}
}
//memcpy (Z, A.Z, (zeilen,spalten) * sizeof(double));
return A; //ermöglicht A=B=C
}
matrix matrix:: operator+ (const matrix& A)
{
if(A.zeilen != zeilen || A.spalten != spalten)
{
cout<< "Die Matrizen haben unterschiedliche groesse und koennen daher nicht addiert werden"<<endl;
}
else
{
matrix ret(A);
for (int i = 0; i < zeilen; i++)
{
for (int k = 0; k < spalten; k++)
{
ret.Z[i][k] = Z[i][k] +A.Z[i][k] ;
}
}
return ret;
}
}
matrix matrix:: operator- (const matrix& A)
{
if(A.zeilen != zeilen || A.spalten != spalten)
{
cout<< "Die Matrizen haben unterschiedliche groesse und koennen daher nicht subtrahiert werden"<<endl;
}
else
{
matrix ret(A);
for (int i = 0; i < zeilen; i++)
{
for (int k = 0; k < spalten; k++)
{
ret.Z[i][k] = Z[i][k] - A.Z[i][k] ;
}
}
return ret;
}
}
matrix matrix:: operator* (const matrix& A)
{
if(zeilen != A.spalten)
{
cout<< "Die die Dimension der Zeilen der ersten Matrix stimmen nicht mit der Dimension der Spalten er zweiten Matrix überein. Sie können daher nicht multipliziert werden"<<endl;
}
int i, k,j;
matrix ret(zeilen, A.spalten);
for (i = 0; i < zeilen; i++)
{
for (j = 0; j < A.spalten; j++)
{
double sum=0.;
for (k = 0; k< spalten ; k++)
{
sum=Z[i][k]*A.Z[k][j] +sum;
}
ret.Z[i][j]=sum;
}
}
return ret;
}
matrix matrix::transpose()
{
matrix B(spalten,zeilen);
for (int i=0;i<spalten;i++)
{
for(int k=0;k<zeilen;k++)
{
B.Z[i][k]=Z[k][i];
}
}
return B;
}