Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C] Перегрузка операций 
:(
    Опции темы
dyb
Дата 31.3.2007, 00:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 13.12.2006

Репутация: нет
Всего: нет



1.Написать свой класс, реализующий матричную арифметику. Операции сложения и умножения матриц должны быть реализованы через перегрузку соответствующих операторов.
2.Написать свой класс, реализующий матричную арифметику. Операции сложения и умножения матриц, а также сложения матрицы с числом и умножения матрицы на число должны быть реализованы в виде перегруженных методов класса.

PM MAIL   Вверх
JAPH
Дата 31.3.2007, 08:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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();
}



--------------------
Что непонятно - спрашиваем smile
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0868 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.