Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
392 / 284 / 53
Регистрация: 26.12.2009
Сообщений: 874
1

матрица. клас

12.02.2012, 17:08. Показов 2465. Ответов 24
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Решил создать класс квадратных матриц. Вот что получилось. Все работает, но хотелось бы услышать
Ваше мнение и любые(ВСЕ) замечания

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);
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.02.2012, 17:08
Ответы с готовыми решениями:

матрица. клас. 2
в продолжение этой темы вот заголовочный файл: #pragma once #include &lt;vector&gt; #include...

клас Letter, клас Person
Створити клас Letter, що мiстить наступнi елементи: - поле «вiдправник» Person*Sender; - поле...

клас птиц
Ребята помогите!!!!! 1)Создать консольный проект, в котором используется приведенный класс...

Векторы+клас
Добрый вечер! Помогите пожалуйста кто-нибуть в написании или обьяснении создания програмы: Создать...

24
594 / 532 / 76
Регистрация: 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)
тока тип Инт ?

ну а так в целом норм чо
2
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
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;
}
и да, почему не шаблон?
1
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
12.02.2012, 19:12 4
Цитата Сообщение от alex_x_x Посмотреть сообщение
а как например можно делить матрицы?
хз)

мона на число делить
1
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
12.02.2012, 19:46 5
Цитата Сообщение от alex_x_x Посмотреть сообщение
в таких случаях обычно делают проверку, что справа находится не тот же самый объекти и возвращают ссылку, те нечто вроде
ну или своп
1
392 / 284 / 53
Регистрация: 26.12.2009
Сообщений: 874
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)
тока тип Инт ?
сначала доведу, а потом сделаю как шаблонный
0
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
12.02.2012, 21:17 7
Цитата Сообщение от Mayonez Посмотреть сообщение
нужно создавать новый объект внутри оператора и возвращать его?
Да, именно так. Причем лучше возвращать константный объект. Да и функции сами -,+,*,/ должны быть константными.
1
Эксперт С++
1674 / 1046 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
12.02.2012, 21:25 8
Смысл у операции деления матриц можно с небольшой натяжкой свести к умножению на обратную матрицу.
1
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
12.02.2012, 21:26 9
ага, а потом начнем возводить матрицы в степень/извлекать корни
1
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
12.02.2012, 21:30 10
Цитата Сообщение от alex_x_x Посмотреть сообщение
а как например можно делить матрицы?
Например, по аналогии с числами, матрицу A умножить на матрицу, обратную B.

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

Не по теме:

Опаздываю :wall:



Добавлено через 56 секунд
retmas, насколько мне известно, для квадратных матриц определена операция возведения в степень.
1
4773 / 2582 / 894
Регистрация: 29.11.2010
Сообщений: 5,590
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
1
392 / 284 / 53
Регистрация: 26.12.2009
Сообщений: 874
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);
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
12.02.2012, 21:49 13
Mayonez, осли определён унарный оператор -.
0
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
12.02.2012, 22:00 14
Цитата Сообщение от Toshkarik Посмотреть сообщение
Да, именно так. Причем лучше возвращать константный объект. Да и функции сами -,+,*,/ должны быть константными.
можно же возвращать const matrix&, тогда нельзя будет написать (m1 = m2) = m3;
вообще для матриц больших размерностей нужно быть осторожней с созданием новых матриц на лету
к слову в бусте у Matrix возвращаются только ссылки

Цитата Сообщение от silent_1991 Посмотреть сообщение
Например, по аналогии с числами, матрицу A умножить на матрицу, обратную B.
да, у обратных матриц даже обозначение есть A^(-1), и в матлабе A/B дает решение системы AX = B, но в целом нахождение обратной матрицы более нетривиально чем весь представленный класс
0
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
12.02.2012, 22:14 15
Цитата Сообщение от alex_x_x Посмотреть сообщение
можно же возвращать const matrix&, тогда нельзя будет написать (m1 = m2) = m3;
Я про функцию operator= ничего не говорил. И как же вы будете возвращать ссылку на временный объект?
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
12.02.2012, 22:22 16
Цитата Сообщение от silent_1991 Посмотреть сообщение
Например, по аналогии с числами, матрицу A умножить на матрицу, обратную B.

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

Не по теме:

Опаздываю :wall:



Добавлено через 56 секунд
retmas, насколько мне известно, для квадратных матриц определена операция возведения в степень.
silent_1991, я утрировал. на мой взгляд вводить подобные операции лишнее.
вы же не писали, я надеюсь, изучая мат. дисциплины, подобные конструкции для матриц А и В:
А / В.
есть четко определенные операции: + и *.
не стоит вводить новые не принятые(!) операции только от того, что они могли бы казаться кому-то разумными. думаю, если математик увидит А / В для матриц - он ошалеет и почему он должен догадываться, что это может значить А * В^(-1)
0
392 / 284 / 53
Регистрация: 26.12.2009
Сообщений: 874
12.02.2012, 22:31  [ТС] 17
Цитата Сообщение от lemegeton Посмотреть сообщение
В-третьих, результат оператора "-" константный. Получается, нельзя сделать
нужно сделать не константным или есть другое решение?
0
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
12.02.2012, 22:33 18
Toshkarik, пардон, не понял о чем речь

кстати очень плохо, что не происходит проверки соответствия размерности матриц
0
392 / 284 / 53
Регистрация: 26.12.2009
Сообщений: 874
12.02.2012, 22:36  [ТС] 19
Цитата Сообщение от lemegeton Посмотреть сообщение
2. Напишите explicit перед конструктором с параметром.
не совсем понял...

Добавлено через 50 секунд
Цитата Сообщение от alex_x_x Посмотреть сообщение
кстати очень плохо, что не происходит проверки соответствия размерности матриц
а если не совпадают, что возвращать? или бросать исключение?
0
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
12.02.2012, 22:39 20
Цитата Сообщение от Mayonez Посмотреть сообщение
а если не совпадают, что возвращать? или бросать исключение?
да, какойнибудь std::range_error будет хорошим вариантом
ибо в матричных операциях недопустимо участие матриц несовместимых размерностей
1
12.02.2012, 22:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.02.2012, 22:39
Помогаю со студенческими работами здесь

клас myDate
Создайте класс Date, который будет содержать информацию о дате (день, месяц, год). С помощью...

клас обработчик
Написать класс обработчик исключительных ситуаций. Программа ловит ошибкуделения на нуль и...

переделать клас
Всем привет! Надо немножко доработать етот код #include &lt;iostream&gt; #include &lt;stdio.h&gt; using...

создать клас HugeInt
Описать класс, реализующий указанный ниже тип данных. Класс должен содержать множество...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru