Форум программистов, компьютерный форум CyberForum.ru

матрица. клас - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
Mayonez
 Аватар для Mayonez
379 / 271 / 20
Регистрация: 26.12.2009
Сообщений: 875
12.02.2012, 17:08     матрица. клас #1
Решил создать класс квадратных матриц. Вот что получилось. Все работает, но хотелось бы услышать
Ваше мнение и любые(ВСЕ) замечания

matrix.hpp
объявление
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#ifndef _MATRIX_
#define _MATRIX_
 
#include <vector>
#include <iostream>
 
typedef std::vector<int>      T_vector;
typedef std::vector<T_vector> T_matrix;
 
class matrix
{
public:
    matrix();
    matrix(int size);
    //----------------------------------------
    const matrix operator-();
    
    bool   operator== (const matrix& m);
    bool   operator!= (const matrix& m);
    
    matrix operator=  (const matrix& matr); 
    matrix operator+  (const matrix& matr);
    matrix operator-  (const matrix& matr);
    
    friend std::ostream& operator<<(std::ostream& stream, const matrix& matr);
    friend std::istream& operator>>(std::istream& stream,       matrix& matr);      
    
    int  size() const  { return _matrix.size();             } 
    void resize(int n) { _matrix.resize(n, T_vector(n, 0)); }
    
private:
    T_matrix _matrix;
};
 
#endif


matrix.cpp
реализация
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include "matrix.hpp"
 
matrix::matrix() {}
 
matrix::matrix(int size)
{
    _matrix.resize(size, T_vector(size, 0));
}
 
const matrix matrix::operator-() 
{
    int sz = (*this).size();
    for(int i = 0; i < sz; i++)
        for(int j = 0; j < sz; j++)
            _matrix[i][j] = -_matrix[i][j];
    return *this;
}
 
std::ostream& operator<<(std::ostream& stream, const matrix& matr)
{
    int sz = matr.size();
    for(int i = 0; i < sz; i++)
    {
        for(int j = 0; j < sz; j++)
            stream << matr._matrix[i][j] << " ";
        stream << std::endl;
    }
    return stream;
}
 
std::istream& operator>>(std::istream& stream, matrix& matr)
{
    int sz = matr.size();
    for(int i = 0; i < sz; i++)
        for(int j = 0; j < sz; j++)
            stream >> matr._matrix[i][j];
    return stream;
}
 
matrix matrix::operator=(const matrix& matr)
{
    int sz = matr.size();
    for(int i = 0; i < sz; i++)
        for(int j = 0; j < sz; j++) 
            _matrix[i][j] = matr._matrix[i][j];
    return *this;
}
 
matrix matrix::operator+(const matrix& matr)
{
    int sz = (*this).size();
    for(int i = 0; i < sz; i++)
        for(int j = 0; j < sz; j++)
            _matrix[i][j] += matr._matrix[i][j];
    return *this;
}
 
matrix matrix::operator-(const matrix& matr)
{
    int sz = (*this).size();
    for(int i = 0; i < sz; i++)
        for(int j = 0; j < sz; j++)
            _matrix[i][j] += matr._matrix[i][j];
    return *this;
}
 
bool matrix::operator==(const matrix& m)
{
    int sz = (*this).size();
    for(int i = 0; i < sz; i++)
        for(int j = 0; j < sz; j++)
            if(m._matrix[i][j] != this->_matrix[i][j])
                return false;
    return true;
}
 
bool matrix::operator!=(const matrix& m)
{
    return !(*this == m);
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.02.2012, 17:08     матрица. клас
Посмотрите здесь:

клас обработчик C++
C++ Простой клас Student
C++ Векторы+клас
C++ матрица. клас. 2
переделать клас C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
12.02.2012, 19:02     матрица. клас #2
1)
у вас неправильная логика работы операторов + и -.
они никак не могут возвращать this.
представьте себе ситуацию:
int a,b,c;
a=b+c;
- в вашем случае переменная b изменится!

(у вас он работает как оператор +=. только ссылку тогда уж возвращать надо.)

2)
почему иногда (*this). а иногда -> ?

3)
почему нет операторов * / ?

4)
тока тип Инт ?

ну а так в целом норм чо
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
12.02.2012, 19:07     матрица. клас #3
Цитата Сообщение от OstapBender Посмотреть сообщение
почему нет операторов * /
а как например можно делить матрицы?
Цитата Сообщение от Mayonez Посмотреть сообщение
matrix matrix::operator=(const matrix& matr)
{
int sz = matr.size();
for(int i = 0; i < sz; i++)
for(int j = 0; j < sz; j++)
_matrix[i][j] = matr._matrix[i][j];
return *this;
}
в таких случаях обычно делают проверку, что справа находится не тот же самый объекти и возвращают ссылку, те нечто вроде

C++
1
2
3
4
5
6
matrix& operator=(const matrix& m) 
{
    if (this == &m) { return *this; }
    // ....
    return *this;
}
и да, почему не шаблон?
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
12.02.2012, 19:12     матрица. клас #4
Цитата Сообщение от alex_x_x Посмотреть сообщение
а как например можно делить матрицы?
хз)

мона на число делить
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
12.02.2012, 19:46     матрица. клас #5
Цитата Сообщение от alex_x_x Посмотреть сообщение
в таких случаях обычно делают проверку, что справа находится не тот же самый объекти и возвращают ссылку, те нечто вроде
ну или своп
Mayonez
 Аватар для Mayonez
379 / 271 / 20
Регистрация: 26.12.2009
Сообщений: 875
12.02.2012, 21:15  [ТС]     матрица. клас #6
Цитата Сообщение от OstapBender Посмотреть сообщение
1)
у вас неправильная логика работы операторов + и -.
они никак не могут возвращать this.
представьте себе ситуацию:
int a,b,c;
a=b+c;
- в вашем случае переменная b изменится!
нужно создавать новый объект внутри оператора и возвращать его?

Добавлено через 41 секунду
Цитата Сообщение от OstapBender Посмотреть сообщение
2)
почему иногда (*this). а иногда -> ?
ок, -> правильнее в данном случае

Добавлено через 33 секунды
Цитата Сообщение от OstapBender Посмотреть сообщение
3)
почему нет операторов * / ?
умножение добавлю

Добавлено через 36 секунд
Цитата Сообщение от OstapBender Посмотреть сообщение
4)
тока тип Инт ?
сначала доведу, а потом сделаю как шаблонный
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
12.02.2012, 21:17     матрица. клас #7
Цитата Сообщение от Mayonez Посмотреть сообщение
нужно создавать новый объект внутри оператора и возвращать его?
Да, именно так. Причем лучше возвращать константный объект. Да и функции сами -,+,*,/ должны быть константными.
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
12.02.2012, 21:25     матрица. клас #8
Смысл у операции деления матриц можно с небольшой натяжкой свести к умножению на обратную матрицу.
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
12.02.2012, 21:26     матрица. клас #9
ага, а потом начнем возводить матрицы в степень/извлекать корни
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
12.02.2012, 21:30     матрица. клас #10
Цитата Сообщение от alex_x_x Посмотреть сообщение
а как например можно делить матрицы?
Например, по аналогии с числами, матрицу A умножить на матрицу, обратную B.

Добавлено через 23 секунды

Не по теме:

Опаздываю



Добавлено через 56 секунд
retmas, насколько мне известно, для квадратных матриц определена операция возведения в степень.
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
12.02.2012, 21:32     матрица. клас #11
1. Нет обращения к конкретному элементу матрицы. Нельзя задать или получить произвольный элемент матрицы.
2. Напишите explicit перед конструктором с параметром.
C++
1
matrix a = 1; // :)
3. С операторами много штук.
Во-первых, они почему-то модифицируют операнд. Во-вторых, некоторые делают это неправильно. Например, оператор "-" складывает, вместо вычитания.
В-третьих, результат оператора "-" константный. Получается, нельзя сделать
C++
1
2
matrix a;
matrix b = -(-b); // passing 'const matrix' as 'this' argument of 'const matrix ...' discards qualifiers
Mayonez
 Аватар для Mayonez
379 / 271 / 20
Регистрация: 26.12.2009
Сообщений: 875
12.02.2012, 21:48  [ТС]     матрица. клас #12
оператор сложения:
C++
1
2
3
4
5
6
7
8
9
const matrix matrix::operator+(const matrix& matr)
{
    int sz = this->size();
    matrix temp(sz);
    for(int i = 0; i < sz; i++)
        for(int j = 0; j < sz; j++)
            temp._matrix[i][j] = _matrix[i][j] + matr._matrix[i][j]; 
    return temp;
}
и соответственно вычитания
C++
1
2
3
4
5
6
7
8
9
const matrix matrix::operator-(const matrix& matr)
{
    int sz = this->size();
    matrix temp(sz);
    for(int i = 0; i < sz; i++)
        for(int j = 0; j < sz; j++)
            temp._matrix[i][j] = _matrix[i][j] - matr._matrix[i][j]; 
    return temp;
}
можно ли сделать оператор вычитания как-то так:
C++
1
return *this + (-matr);
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
12.02.2012, 21:49     матрица. клас #13
Mayonez, осли определён унарный оператор -.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
12.02.2012, 22:00     матрица. клас #14
Цитата Сообщение от Toshkarik Посмотреть сообщение
Да, именно так. Причем лучше возвращать константный объект. Да и функции сами -,+,*,/ должны быть константными.
можно же возвращать const matrix&, тогда нельзя будет написать (m1 = m2) = m3;
вообще для матриц больших размерностей нужно быть осторожней с созданием новых матриц на лету
к слову в бусте у Matrix возвращаются только ссылки

Цитата Сообщение от silent_1991 Посмотреть сообщение
Например, по аналогии с числами, матрицу A умножить на матрицу, обратную B.
да, у обратных матриц даже обозначение есть A^(-1), и в матлабе A/B дает решение системы AX = B, но в целом нахождение обратной матрицы более нетривиально чем весь представленный класс
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
12.02.2012, 22:14     матрица. клас #15
Цитата Сообщение от alex_x_x Посмотреть сообщение
можно же возвращать const matrix&, тогда нельзя будет написать (m1 = m2) = m3;
Я про функцию operator= ничего не говорил. И как же вы будете возвращать ссылку на временный объект?
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
12.02.2012, 22:22     матрица. клас #16
Цитата Сообщение от silent_1991 Посмотреть сообщение
Например, по аналогии с числами, матрицу A умножить на матрицу, обратную B.

Добавлено через 23 секунды

Не по теме:

Опаздываю



Добавлено через 56 секунд
retmas, насколько мне известно, для квадратных матриц определена операция возведения в степень.
silent_1991, я утрировал. на мой взгляд вводить подобные операции лишнее.
вы же не писали, я надеюсь, изучая мат. дисциплины, подобные конструкции для матриц А и В:
А / В.
есть четко определенные операции: + и *.
не стоит вводить новые не принятые(!) операции только от того, что они могли бы казаться кому-то разумными. думаю, если математик увидит А / В для матриц - он ошалеет и почему он должен догадываться, что это может значить А * В^(-1)
Mayonez
 Аватар для Mayonez
379 / 271 / 20
Регистрация: 26.12.2009
Сообщений: 875
12.02.2012, 22:31  [ТС]     матрица. клас #17
Цитата Сообщение от lemegeton Посмотреть сообщение
В-третьих, результат оператора "-" константный. Получается, нельзя сделать
нужно сделать не константным или есть другое решение?
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
12.02.2012, 22:33     матрица. клас #18
Toshkarik, пардон, не понял о чем речь

кстати очень плохо, что не происходит проверки соответствия размерности матриц
Mayonez
 Аватар для Mayonez
379 / 271 / 20
Регистрация: 26.12.2009
Сообщений: 875
12.02.2012, 22:36  [ТС]     матрица. клас #19
Цитата Сообщение от lemegeton Посмотреть сообщение
2. Напишите explicit перед конструктором с параметром.
не совсем понял...

Добавлено через 50 секунд
Цитата Сообщение от alex_x_x Посмотреть сообщение
кстати очень плохо, что не происходит проверки соответствия размерности матриц
а если не совпадают, что возвращать? или бросать исключение?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.02.2012, 22:39     матрица. клас
Еще ссылки по теме:

C++ клас Letter, клас Person
C++ клас myDate
клас птиц C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
12.02.2012, 22:39     матрица. клас #20
Цитата Сообщение от Mayonez Посмотреть сообщение
а если не совпадают, что возвращать? или бросать исключение?
да, какойнибудь std::range_error будет хорошим вариантом
ибо в матричных операциях недопустимо участие матриц несовместимых размерностей
Yandex
Объявления
12.02.2012, 22:39     матрица. клас
Ответ Создать тему
Опции темы

Текущее время: 13:41. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru