Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
Mayonez
380 / 272 / 21
Регистрация: 26.12.2009
Сообщений: 875
#1

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

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

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

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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.02.2012, 17:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос матрица. клас (C++):

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

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

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

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

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

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

24
OstapBender
584 / 523 / 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)
тока тип Инт ?

ну а так в целом норм чо
2
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 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
OstapBender
584 / 523 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
12.02.2012, 19:12 #4
Цитата Сообщение от alex_x_x Посмотреть сообщение
а как например можно делить матрицы?
хз)

мона на число делить
1
retmas
Жарю без масла
864 / 746 / 168
Регистрация: 13.01.2012
Сообщений: 1,702
12.02.2012, 19:46 #5
Цитата Сообщение от alex_x_x Посмотреть сообщение
в таких случаях обычно делают проверку, что справа находится не тот же самый объекти и возвращают ссылку, те нечто вроде
ну или своп
1
Mayonez
380 / 272 / 21
Регистрация: 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)
тока тип Инт ?
сначала доведу, а потом сделаю как шаблонный
0
Toshkarik
1143 / 860 / 51
Регистрация: 03.08.2011
Сообщений: 2,390
Завершенные тесты: 1
12.02.2012, 21:17 #7
Цитата Сообщение от Mayonez Посмотреть сообщение
нужно создавать новый объект внутри оператора и возвращать его?
Да, именно так. Причем лучше возвращать константный объект. Да и функции сами -,+,*,/ должны быть константными.
1
Nick Alte
Эксперт С++
1640 / 1012 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
12.02.2012, 21:25 #8
Смысл у операции деления матриц можно с небольшой натяжкой свести к умножению на обратную матрицу.
1
retmas
Жарю без масла
864 / 746 / 168
Регистрация: 13.01.2012
Сообщений: 1,702
12.02.2012, 21:26 #9
ага, а потом начнем возводить матрицы в степень/извлекать корни
1
silent_1991
Эксперт С++
4987 / 3044 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
12.02.2012, 21:30 #10
Цитата Сообщение от alex_x_x Посмотреть сообщение
а как например можно делить матрицы?
Например, по аналогии с числами, матрицу A умножить на матрицу, обратную B.

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

Не по теме:

Опаздываю



Добавлено через 56 секунд
retmas, насколько мне известно, для квадратных матриц определена операция возведения в степень.
1
lemegeton
2925 / 1354 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
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
Mayonez
380 / 272 / 21
Регистрация: 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);
0
silent_1991
Эксперт С++
4987 / 3044 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
12.02.2012, 21:49 #13
Mayonez, осли определён унарный оператор -.
0
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 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
Toshkarik
1143 / 860 / 51
Регистрация: 03.08.2011
Сообщений: 2,390
Завершенные тесты: 1
12.02.2012, 22:14 #15
Цитата Сообщение от alex_x_x Посмотреть сообщение
можно же возвращать const matrix&, тогда нельзя будет написать (m1 = m2) = m3;
Я про функцию operator= ничего не говорил. И как же вы будете возвращать ссылку на временный объект?
0
12.02.2012, 22:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.02.2012, 22:14
Привет! Вот еще темы с ответами:

переделать клас - C++
Всем привет! Надо немножко доработать етот код #include &lt;iostream&gt; #include &lt;stdio.h&gt; using namespace std; const int count = 5; ...

Клас многочлен наследствие - C++
Помогите пожалуйсто. Нужно унаследствовать клас многочлен. Что можна унаследствовать (какой клас можно сделать потомком)?

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

Клас колода карт - C++
Класс CardDeck (колода карт). Класс сохраняет массив из 32 карт (cards), а также текущую карту (currentCard). Надо написать функцию для...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru