Реализация класса матрица
Листинг C++
const double eps = 1e-9;
class matrix
{
private:
double **a;
int n, m;
public:
// матрица без элементов
matrix ()
{
a = 0;
n = 0;
m = 0;
}
// матрица NxM, если E, то единичная, иначе нулевая
matrix (int N, int M, bool E = 0)
{
n = N;
m = M;
a = new double *[n];
for (int i = 0; i < n; ++ i)
{
a[i] = new double[m];
for (int j = 0; j < m; ++ j)
a[i][j] = (i == j) * E;
}
}
// матрица из элементов array, если horizontal, то горизонтальная, иначе вертикальная
matrix (double array[], int N, bool horizontal)
{
if (horizontal)
{
n = 1;
m = N;
a = new double *[1];
a[0] = new double[m];
for (int i = 0; i < m; ++ i)
a[0][i] = array[i];
}
else
{
n = N;
m = 1;
a = new double *[n];
for (int i = 0; i < n; ++ i)
{
a[i] = new double[1];
a[i][0] = array[i];
}
}
}
int N ()
{
return n;
}
int M ()
{
return m;
}
double* operator [] (int index)
{
return getRow (index);
}
// получить строку матрицы
double* getRow (int index)
{
if (index >= 0 && index < n)
return a[index];
return 0;
}
// получить столбец матрицы
double* getColumn (int index)
{
if (index < 0 || index >= m)
return 0;
double * c = new double [n];
for (int i = 0; i < n; ++ i)
c[i] = a[i][index];
return c;
}
// поменять местами две строки
void swapRows (int index1, int index2)
{
if (index1 < 0 || index2 < 0 || index1 >= n || index2 >= n)
return ;
for (int i = 0; i < m; ++ i)
swap (a[index1][i], a[index2][i]);
}
// поменять местами два столбца
void swapColumns (int index1, int index2)
{
if (index1 < 0 || index2 < 0 || index1 >= m || index2 >= m)
return ;
for (int i = 0; i < n; ++ i)
swap (a[i][index1], a[i][index2]);
}
// приписывание матрицы b к текущей матрице справа
matrix concateMatrix (matrix & b)
{
if (n != b.N ())
return matrix ();
matrix c = matrix (n, m + b.M ());
for (int i = 0; i < n; ++ i)
{
for (int j = 0; j < m; ++ j)
c[i][j] = a[i][j];
for (int j = 0; j < b.M (); ++ j)
c[i][j + m] = b[i][j];
}
return c;
}
// удаление столбцов с index1 по index2
matrix eraseColumns (int index1, int index2)
{
matrix c = matrix (n, m - (index2 - index1 + 1));
for (int j = 0; j < index1; ++ j)
for (int i = 0; i < n; ++ i)
c[i][j] = a[i][j];
for (int j = index2 + 1; j < m; ++ j)
for (int i = 0; i < n; ++ i)
c[i][j - index2 - 1 + index1] = a[i][j];
return c;
}
};
// прочитать матрицу с консоли
matrix scanMatrix ()
{
int n, m;
scanf ("%d%d", & n, & m);
matrix a = matrix (n, m);
for (int i = 0; i < n; ++ i)
for (int j = 0; j < m; ++ j)
scanf ("%lf", & a[i][j]);
return a;
}
// вывести матрицу на консоль
void printMatrix (matrix & a)
{
for (int i = 0; i < a.N (); ++ i)
{
for (int j = 0; j < a.M (); ++ j)
printf ("%5.3lf ", a[i][j]);
puts ("");
}
}
// сложить две матрицы
matrix add (matrix & a, matrix & b)
{
if (a.N () != b.N () || a.M () != b.M ())
return matrix ();
matrix c = matrix (a.N (), b.M ());
for (int i = 0; i < a.N (); ++ i)
for (int j = 0; j < a.M (); ++ j)
c[i][j] = a[i][j] + b[i][j];
return c;
}
// умножение матрицы на число
matrix mul (matrix & a, double k)
{
matrix c = matrix (a.N (), a.M ());
for (int i = 0; i < a.N (); ++ i)
for (int j = 0; j < a.M (); ++ j)
c[i][j] = a[i][j] * k;
return c;
}
// умножение двух матриц
matrix mul (matrix & a, matrix & b)
{
if (a.M () != b.N ())
return matrix ();
matrix c = matrix (a.N (), b.M ());
for (int i = 0; i < a.N (); ++ i)
for (int j = 0; j < b.M (); ++ j)
for (int k = 0; k < a.M (); ++ k)
c[i][j] += a[i][k] * b[k][j];
return c;
}
// транспонирование матрицы
matrix transp (matrix & a)
{
matrix c = matrix (a.M (), a.N ());
for (int i = 0; i < a.N (); ++ i)
for (int j = 0; j < a.M (); ++ j)
c[j][i] = a[i][j];
return c;
}
Создана 04.01.2011 15:47
Изменена 04.01.2011 20:23
По всем вопросам обращаться: rumterg@gmail.com