Опытный
 
Профиль
Группа: Участник
Сообщений: 312
Регистрация: 8.1.2007
Где: Ленобласть
Репутация: 12 Всего: 23
|
А в чем конкретно сложности? Не знаете, как перемножать матрицы? Не можете организовать класс, понять, какие данные нужно хранить? Не знаете синтаксис перегрузки? У меня есть класс матриц, но он реализован через вектора. Если такое подойдет, то вот. Иначе просто смотрим, разбираемся, задаем вопросы, делаем то, что требуется. Код | #include "stdafx.h" #include <iostream> #include <stdio.h> using namespace std; class Vector { private: int s; double* c; public: Vector(); Vector(int _s); Vector(int _s, double cs); Vector(const Vector& v); ~Vector(); void print() const; Vector& operator = (const Vector& v); Vector& operator = (double cs); Vector& operator += (const Vector& q); Vector& operator += (double cs); Vector& operator *= (double cs); Vector& operator -= (const Vector& p); Vector& operator -= (double cs); Vector& operator /= (double cs); Vector& operator <<= (int n); Vector& operator >>= (int n); double& operator [] (int n) const; friend Vector operator + (const Vector& p, const Vector& q); friend Vector operator + (const Vector& p, double cs); friend Vector operator + (double cs, const Vector& p); friend Vector operator * (const Vector& p, double cs); friend Vector operator * (double cs, const Vector& p); friend double operator * (const Vector& p, const Vector& q); friend Vector operator - (const Vector& p); friend Vector operator - (const Vector& p, const Vector& q); friend Vector operator - (const Vector& p, double cs); friend Vector operator - (double cs, const Vector& p); friend Vector operator / (const Vector& p, double cs); friend Vector operator << (const Vector& p, int n); friend Vector operator >> (const Vector& p, int n); friend bool operator == (const Vector& p, const Vector& q); friend bool operator != (const Vector& p, const Vector& q); friend bool operator <= (const Vector& p, const Vector& q); friend bool operator < (const Vector& p, const Vector& q); friend bool operator >= (const Vector& p, const Vector& q); friend bool operator > (const Vector& p, const Vector& q); }; class Matrix { private: int m, n; Vector* a; Matrix Opposite() const; public: Matrix(); Matrix(int _m, int _n); Matrix(int _m, int _n, double e); Matrix(const Matrix& A); ~Matrix(); Vector GetRow(int i) const; void SetRow(int i, Vector r); Vector GetColumn(int j) const; void SetColumn(int j, Vector c); void print() const; Matrix Minor(int il, int jl, int ir, int jr) const; Matrix LeftOpposite() const; Matrix RightOpposite() const; double Det() const; Matrix Transp() const; Matrix& operator = (const Matrix& A); Matrix& operator = (double e); Matrix& operator += (const Matrix& A); Matrix& operator += (double e); Matrix& operator *= (const Matrix& A); Matrix& operator *= (double e); Matrix& operator /= (double e); Matrix& operator /= (const Matrix& A); Vector& operator [] (int i) const; friend Matrix operator + (const Matrix& A, const Matrix& B); friend Matrix operator + (const Matrix& A, double e); friend Matrix operator + (double e, const Matrix& A); friend Matrix operator - (const Matrix& A, const Matrix& B); friend Matrix operator - (const Matrix& A, double e); friend Matrix operator - (double e, const Matrix& A); friend Matrix operator - (const Matrix& A); friend Matrix operator * (const Matrix& A, const Matrix& B); friend Matrix operator * (const Matrix& A, double e); friend Matrix operator * (double e, const Matrix& A); friend Matrix operator / (const Matrix& A, const Matrix& B); friend Matrix operator / (const Matrix& A, double e); friend Matrix operator / (double e, const Matrix& A); friend bool operator == (const Matrix& A, const Matrix& B); friend bool operator == (const Matrix& A, double e); friend bool operator == (double e, const Matrix& A); friend bool operator != (const Matrix& A, const Matrix& B); friend bool operator != (const Matrix& A, double e); friend bool operator != (double e, const Matrix& A); }; Vector::Vector() { s = 1; c = new double[1]; c[0] = 0; } Vector::Vector(int _s) { s = _s; c = new double[s]; for (int i = 0; i < s; i++) c[i] = 0; } Vector::Vector(int _s, double cs) { s = _s; c = new double[s]; for (int i = 0; i < s; i++) c[i] = cs; } Vector::Vector(const Vector& v) { *this = v; } Vector::~Vector() { delete [] c; } void Vector::print() const { cout<<"("<<c[0]; for (int i = 1; i < s; i++) cout<<", "<<c[i]; cout<<")"; } Vector& Vector::operator = (const Vector& v) { s = v.s; c = new double[s]; for (int i = 0; i < s; i++) c[i] = v.c[i]; return *this; } Vector& Vector::operator = (double cs) { for (int i = 0; i < s; i++) c[i] = cs; return *this; } Vector& Vector::operator += (const Vector& q) { return *this = *this + q; } Vector& Vector::operator += (double cs) { return *this = *this + cs; } Vector& Vector::operator *= (double cs) { return *this = *this * cs; } Vector& Vector::operator -= (const Vector& p) { return *this = *this - p; } Vector& Vector::operator -= (double cs) { return *this = *this - cs; } Vector& Vector::operator /= (double cs) { return *this = *this / cs; } double& Vector::operator [] (int n) const { while (n < 0) n += s; n %= s; return c[n]; } Vector operator + (const Vector& p, const Vector& q) { Vector t; if (p.s >= q.s) { t = p; for (int i = 0; i < q.s; i++) t.c[i] += q.c[i]; } else { t = q; for (int i = 0; i < p.s; i++) t.c[i] = p.c[i] + t.c[i]; } return t; } Vector operator + (const Vector& p, double cs) { Vector t(p.s, cs); return p + t; } Vector operator + (double cs, const Vector& p) { Vector t(p.s, cs); return t + p; } Vector operator - (const Vector& p) { Vector t = p; for (int i = 0; i < t.s; i++) t.c[i] = -t.c[i]; return t; } Vector operator - (const Vector& p, const Vector& q) { Vector t; if (p.s >= q.s) { t = p; for (int i = 0; i < q.s; i++) t.c[i] -= q.c[i]; } else { t = q; for (int i = 0; i < p.s; i++) t.c[i] = p.c[i] - t.c[i]; } return t; } Vector operator - (const Vector& p, double cs) { Vector t(p.s, cs); return p - t; } Vector operator - (double cs, const Vector& p) { Vector t(p.s, cs); return t - p; } Vector operator * (const Vector& p, double cs) { Vector t = p; for (int i = 0; i < t.s; i++) t.c[i] *= cs; return t; } Vector operator * (double cs, const Vector& p) { Vector t = p; for (int i = 0; i < t.s; i++) t.c[i] = cs * t.c[i]; return t; } double operator * (const Vector& p, const Vector& q) { int s = p.s; if (p.s > q.s) s = q.s; double sc = 0; for (int i = 0; i < s; i++) sc += p.c[i] * q.c[i]; return sc; } Vector operator / (const Vector& p, double cs) { return p * (1 / cs); } Vector operator << (const Vector& p, int n) { if (n < 0) return p >> (-n); Vector t(p.s); for (int i = 0; i < p.s; i++) t.c[i] = p.c[(i + n) % p.s]; return t; } Vector operator >> (const Vector& p, int n) { if (n < 0) return p << (-n); Vector t(p.s); for (int i = 0; i < p.s; i++) t.c[(i + n) % p.s] = p.c[i]; return t; } Vector& Vector::operator <<= (int n) { Vector t = *this; return *this = t << n; } Vector& Vector::operator >>= (int n) { Vector t = *this; return *this = t >> n; } bool operator == (const Vector& p, const Vector& q) { if (p.s != q.s) return false; for (int i = 0; i < p.s; i++) if (p.c[i] != q.c[i]) return false; return true; } bool operator != (const Vector& p, const Vector& q) { return ! (p == q); } bool operator <= (const Vector& p, const Vector& q) { if (p == q) return true; int s = p.s; if (s > q.s) s = q.s; for (int i = 0; i < s; i++) { if (p.c[i] < q.c[i]) return true; if (p.c[i] > q.c[i]) return false; } return p.s < q.s; } bool operator < (const Vector& p, const Vector& q) { return p <= q && p != q; } bool operator >= (const Vector& p, const Vector& q) { return ! (p < q); } bool operator > (const Vector& p, const Vector& q) { return ! (p <= q); } Matrix::Matrix() { m = 1; n = 1; a = new Vector[1]; } Matrix::Matrix(int _m, int _n) { m = _m; n = _n; a = new Vector[m]; for (int i = 0; i < m; i++) { a[i] = Vector(n); if (i < n) a[i][i] = 1; } } Matrix::Matrix(int _m, int _n, double e) { m = _m; n = _n; a = new Vector[m]; for (int i = 0; i < m; i++) { a[i] = Vector(n); if (i < n) a[i][i] = e; } } Matrix::Matrix(const Matrix& A) { *this = A; } Matrix::~Matrix() { delete [] a; } void Matrix::print() const { for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) printf("%8.3f", a[i][j]); cout<<"\n"; } } Vector Matrix::GetRow(int i) const { return operator [] (i); } void Matrix::SetRow(int i, Vector r) { operator [] (i) = r; } Vector Matrix::GetColumn(int j) const { while (j < 0) j += n; j %= n; Vector t(m); for (int i = 0; i < m; i++) t[i] = a[i][j]; return t; } void Matrix::SetColumn(int j, Vector c) { while (j < 0) j += n; j %= n; for (int i = 0; i < m; i++) a[i][j] = c[i]; } Matrix Matrix::Minor(int il, int jl, int ir, int jr) const { if (--il < 0) il = 0; if (il > m - 1) il = m - 1; if (--jl < 0) jl = 0; if (jl > n - 1) jl = n - 1; if (--ir > m - 1) ir = m - 1; if (ir < 0) ir = 0; if (--jr > n - 1) jr = n - 1; if (jr < 0) jr = 0; if (il > ir) { int t = ir; ir = il; il = t; } if (jl > jr) { int t = jl; jl = jr; jr = t; } Matrix C(ir - il + 1, jr - jl + 1); for (int i = 0; i <= ir - il; i++) for (int j = 0; j <= jr - jl; j++) C.a[i][j] = a[i + il][j + jl]; return C; } Matrix Matrix::Transp() const { Matrix T(n, m); for (int i = 0; i < m; i++) T.SetColumn(i, a[i]); return T; } Matrix Matrix::Opposite() const { if (m != n) { cout<<"Wrong implementation\n"; exit(0); } Matrix C(m, 2 * n, 1); for (int j = 0; j < n; j++) C.SetColumn(j + n, GetColumn(j)); for (int i = 0; i < m; i++) { int j = i; while (j < m && C[j][i + n] == 0) j++; if (j == m) { cout<<"No opposite matrix\n"; return Matrix(1, 1, 0); } if (i != j) { Vector t = C[i]; C[i] = C[j]; C[j] = t; } C[i] /= C[i][i + n]; for (int j = i + 1; j < m; j++) C[j] -= C[j][i + n] * C[i]; } for (int i = m - 1; i >= 0; i--) for (int j = i - 1; j >= 0; j--) C[j] -= C[j][i + n] * C[i]; return C.Minor(1, 1, m, n); } Matrix Matrix::LeftOpposite() const { if (m == n) return Opposite(); if (m < n) { cout<<"No opposite matrix\n"; return Matrix(1, 1, 0); } Matrix C(m, m + n); for (int i = 0; i < m; i++) for (int j = 0; j < n; j++) C[i][j + m] = a[i][j]; for (int i = 0; i < n; i++) { int j = i; while (j < m && C.a[j][i + m] == 0) j++; if (j == m) { cout<<"Failed\n"; return Matrix(1, 1, 0); } if (i != j) { Vector t = C[i]; C[i] = C[j]; C[j] = t; } C[i] /= C[i][i + m]; for (int j = i + 1; j < m; j++) C[j] -= C[j][i + m] * C[i]; } for (int i = n - 1; i >= 0; i--) for (int j = i - 1; j >= 0; j--) C[j] -= C[j][i + m] * C[i]; return C.Minor(1, 1, n, m); } Matrix Matrix::RightOpposite() const { if (m == n) return Opposite(); if (m > n) { cout<<"No opposite matrix\n"; return Matrix(1, 1, 0); } Matrix C(m + n, n); for (int i = 0; i < m; i++) for (int j = 0; j < n; j++) C[i + n][j] = a[i][j]; for (int i = 0; i < m; i++) { int j = i; while (j < n && C[i + n][j] == 0) j++; if (j == n) { cout<<"Failed\n"; return Matrix(1, 1, 0); } if (i != j) { Vector t = C.GetColumn(i); C.SetColumn(i, C.GetColumn(j)); C.SetColumn(j, t); } C.SetColumn(i, C.GetColumn(i) / C[i + n][i]); for (int j = i + 1; j < n; j++) C.SetColumn(j, C.GetColumn(j) - C[i + n][j] * C.GetColumn(i)); } for (int i = m - 1; i >= 0; i--) for (int j = i - 1; j >= 0; j--) C.SetColumn(j, C.GetColumn(j) - C[i + n][j] * C.GetColumn(i)); return C.Minor(1, 1, n, m); } double Matrix::Det() const { if (m != n) { cout<<"Non-square matrix\n"; return 0; } Matrix t = *this; for (int i = 0; i < m; i++) { int j = i; while (j < m && t[j][i] == 0) j++; if (j == m) return 0; if (i != j) { Vector r = t[i]; t[i] = t[j]; t[j] = r; } for (int j = i + 1; j < m; j++) t[j] -= t[j][i] / t[i][i] * t[i]; } double d = 1; for (int i = 0; i < m; i++) d *= t[i][i]; return d; } Matrix& Matrix::operator = (const Matrix& A) { m = A.m; n = A.n; a = new Vector[m]; for (int i = 0; i < m; i++) { a[i] = Vector(n); for (int j = 0; j < n; j++) a[i][j] = A.a[i][j]; } return *this; } Matrix& Matrix::operator = (double e) { for (int i = 0; i < m; i++) for (int j = 0; j < n; j++) a[i][j] = i == j ? e : 0; return *this; } Matrix& Matrix::operator += (const Matrix& A) { return *this = *this + A; } Matrix& Matrix::operator += (double e) { return *this = *this + e; } Matrix& Matrix::operator *= (const Matrix& A) { return *this = *this * A; } Matrix& Matrix::operator *= (double e) { return *this = *this * e; } Matrix& Matrix::operator /= (double e) { return *this = *this / e; } Matrix& Matrix::operator /= (const Matrix& A) { return *this = *this / A; } Vector& Matrix::operator [] (int i) const { while (i < 0) i += m; i %= m; return a[i]; } Matrix operator + (const Matrix& A, const Matrix& B) { int a = A.m; if (a > B.m) a = B.m; int b = A.n; if (b > B.n) b = B.n; Matrix C(a, b); for (int i = 0; i < a; i++) C[i] = A[i] + B[i]; return C; } Matrix operator + (const Matrix& A, double e) { Matrix B(A.m, A.n, e); return A + B; } Matrix operator + (double e, const Matrix& A) { Matrix B(A.m, A.n, e); return B + A; } Matrix operator - (const Matrix& A, const Matrix& B) { int a = A.m; if (a > B.m) a = B.m; int b = A.n; if (b > B.n) b = B.n; Matrix C(a, b); for (int i = 0; i < a; i++) C[i] = A[i] - B[i]; return C; } Matrix operator - (const Matrix& A, double e) { Matrix B(A.m, A.n, e); return A - B; } Matrix operator - (double e, const Matrix& A) { Matrix B(A.m, A.n, e); return B - A; } Matrix operator - (const Matrix& A) { Matrix C(A.m, A.n); for (int i = 0; i < C.m; i++) C[i] = -A[i]; return C; } Matrix operator * (const Matrix& A, const Matrix& B) { Matrix C(A.m, B.n, 0); int s = A.n; if (s > B.m) s = B.m; for (int i = 0; i < C.m; i++) for (int j = 0; j < s; j++) C[i] += A[i][j] * B[j]; return C; } Matrix operator * (const Matrix& A, double e) { Matrix C(A.m, A.n); for (int i = 0; i < C.m; i++) C[i] = A[i] * e; return C; } Matrix operator * (double e, const Matrix& A) { Matrix C(A.m, A.n); for (int i = 0; i < C.m; i++) C[i] = e * A[i]; return C; } Matrix operator / (const Matrix& A, double e) { return A * (1 / e); } Matrix operator / (const Matrix& A, const Matrix& B) { return A * B.RightOpposite(); } Matrix operator / (double e, const Matrix& A) { return e * A.RightOpposite(); } bool operator == (const Matrix& A, const Matrix& B) { if (A.m != B.m || A.n != B.n) return false; for (int i = 0; i < A.m; i++) if (A[i] != B[i]) return false; return true; } bool operator == (const Matrix& A, double e) { Matrix C(A.m, A.n, e); return A == C; } bool operator == (double e, const Matrix& A) { Matrix C(A.m, A.n, e); return C == A; } bool operator != (const Matrix& A, const Matrix& B) { return ! (A == B); } bool operator != (const Matrix& A, double e) { return ! (A == e); } bool operator != (double e, const Matrix& A) { return ! (e == A); } void main() { Matrix A(4, 4, 2); Matrix B(4, 4); B[0][-1] = 1; cout<<B.Det(); }
|
--------------------
Что непонятно - спрашиваем 
|