1 / 1 / 0
Регистрация: 24.09.2017
Сообщений: 4
1

Создать класс Matrix и функцию сложения матриц

04.10.2017, 23:11. Показов 4963. Ответов 7

Задача: создать класс Matrix на базе vector<vector<int> >, определить операторную функцию ostream& operator<<(ostream&, const Matrix&) для вывода матрицы, а также бинарную операторную функцию operator+(const Matrix&, const Matrix&) для сложения матриц.

Просто прекращается работа программы, никакая сумма матриц, естественно, не выводится... Помогите, пожалуйста, понять в чём проблема.
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
#include <iostream>
#include <cstdlib>
#include <vector>
 
using namespace std;
 
class Matrix
{
private:
    vector<vector<int> > m;
    int r;
    int c;
public:
    Matrix(): m(0){};
    Matrix(vector<vector<int> > mt): m(mt){}
    Matrix(int r, int c): r(r), c(c){}
    void EMatrix() // ввод матрицы
    {
        for(int i = 0; i < r; i++)
        {
            vector<int> temp;
            for(int j = 0; j < c; j++)
            {
                temp.push_back(int(rand()/1000));
            }
        m.push_back(temp);
        }
    }
    friend Matrix operator+(const Matrix& l, const Matrix& k);
    friend ostream& operator<<(ostream& om, const Matrix& m);
};
Matrix operator+(const Matrix& l, const Matrix& k) // сложение матриц
{
    cout << "sum = ";
    Matrix res(l.r, l.c);
    for(int i = 0; i < l.r; i++)
    {
        for(int j = 0; j < l.c; j++)
        {
            res.m[i][j] = l.m[i][j] + k.m[i][j];
        }
    }
    return res;
};
 
ostream& operator<<(ostream& om, const Matrix& m) // вывод матрицы
{
    for(int i = 0; i < m.r; i++)
    {
        for(int j = 0; j < m.c; j++)
            om << m.m[i][j] << " ";
        om << endl;
    }
    return om;
}
int main()
{
    Matrix mat(3, 3);
    mat.EMatrix();
    cout << mat;
    Matrix mat2(3, 3);
    mat2.EMatrix();
    cout << mat2;
    cout << mat + mat2;
    return 0;
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.10.2017, 23:11
Ответы с готовыми решениями:

Создать класс Matrix и функции умножения и сложения матриц
Создайте класс Matrix на базе вектора vector&lt;vector&lt;int&gt;&gt;. Определите операторную функцию ostream&amp;...

Создать класс матриц с целочисленными элементами и определить операции умножения и сложения
Всем привет, помогите с задачей, заранее спасибо. Создать класс матриц с целочисленными элементами...

Создать файл-функцию для сложения матриц
Создать файл функцию, где входными аргументами являются две матрицы размерностью (2х4), а выходной...

Написать свой класс, реализующий матричную арифметику, операции сложения и умножения матриц. Сложения матрицы с числом и
Написать свой класс, реализующий матричную арифметику, операции сложения и умножения матриц....

7
77 / 50 / 16
Регистрация: 17.05.2015
Сообщений: 262
04.10.2017, 23:13 2
Цитата Сообщение от nino123 Посмотреть сообщение
Matrix(int r, int c): r(r), c(c){}
Цитата Сообщение от nino123 Посмотреть сообщение
Matrix mat(3, 3);
У тебя вектор не инициализирован. Он нулевого размера.

если используешь
C++
1
res.m.at(i).at(j)
будет исключение out of range
1
1 / 1 / 0
Регистрация: 24.09.2017
Сообщений: 4
04.10.2017, 23:30  [ТС] 3
Не понимаю... как нулевой? Не могли бы вы написать как правильно сделать?
0
77 / 50 / 16
Регистрация: 17.05.2015
Сообщений: 262
04.10.2017, 23:34 4
Цитата Сообщение от nino123 Посмотреть сообщение
Не понимаю... как нулевой? Не могли бы вы написать как правильно сделать?
У тебя матрица хранится в векторе.
C++
1
vector<vector<int> > m;
Вызывая конструктор
C++
1
Matrix(int r, int c): r(r), c(c){}
Ты задаешь переменную r, c, но сам вектор остается такой как есть, т.е. нулевой.
Добавь в этот конструктор инициализацию вектора (переменной m)
1
1 / 1 / 0
Регистрация: 24.09.2017
Сообщений: 4
05.10.2017, 00:49  [ТС] 5
Valeryn, так?
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
#include <iostream>
#include <cstdlib>
#include <vector>
 
using namespace std;
 
class Matrix
{
private:
    vector<vector<int> > m;
    int r;
    int c;
public:
    Matrix(): m(0){};
    Matrix(vector<vector<int> > m, int r, int c): m(m), r(r), c(c){}
    void EMatrix() // ввод матрицы
    {
        for(int i = 0; i < r; i++)
        {
            vector<int> temp;
            for(int j = 0; j < c; j++)
            {
                temp.push_back(int(rand()/1000));
            }
        m.push_back(temp);
        }
    }
    friend Matrix operator+(const Matrix& l, const Matrix& k);
    friend ostream& operator<<(ostream& om, const Matrix& m);
};
Matrix operator+(const Matrix& l, const Matrix& k) // сложение матриц
{
    cout << "sum = ";
    vector<vector <int> > m;
    Matrix res(m, l.r, l.c);
    for(int i = 0; i < l.r; i++)
    {
        for(int j = 0; j < l.c; j++)
        {
            res.m[i][j] = l.m[i][j] + k.m[i][j];
        }
    }
    return res;
};
Но что тогда писать в main?

Добавлено через 9 минут
Valeryn, а с помощью EMatrix() вектор не заполняется?
0
77 / 50 / 16
Регистрация: 17.05.2015
Сообщений: 262
05.10.2017, 09:06 6
Заполняется. Но В operator+ ты создаешь матрицу, в ней пустой вектор.
В конструктор добавь m(std::vector<std::vector<int> >(r, std::vector<int>(c)))
А в emax по элементно заполняй новыми значениями.
1
693 / 303 / 99
Регистрация: 04.07.2014
Сообщений: 842
05.10.2017, 12:45 7
У тебя в конструкторе матрицы не инициализируются вектора. Это плохо само по себе. Конструктор должен изначально сформировать все данные.

Кроме того. Раз ты реализуешь класс матрицы, то хранить данные можно по разному. И самым выгодным по скорости работы и памяти, считается одномерный массив:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Matrix {
private:
  size_t rows_;             // количество строк
  size_t cols_;             // количество столбцов
  std::vector<double> arr_; // храним матрицу в одномерном массиве с доступом к i,j элементу как arr_[i*cols_+j]
public:
 
  // Конструктор, передаём количество строк и столбцов
  Matrix(size_t rows, size_t cols)
    : rows_(rows),    // инициализация rows_
      cols_(cols),    // инициализация cols_
      arr_(rows*cols) // инициализация вектора arr_ размером rows*cols
  {} // больше делать нечего
 
  size_t rows() { return rows_; } // количество строк
  size_t cols() { return cols_; } // количество столбцов
 
  double &operator ()(size_t row, size_t col) { return arr_[row*cols_+col]; }
};
1
1 / 1 / 0
Регистрация: 24.09.2017
Сообщений: 4
13.10.2017, 23:40  [ТС] 8
Большое спасибо всем за ответы, помогли понять в чём ошибка. Решилась проблема функцией resize(). Вот полный код, если кому-то вдруг понадобится:

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
81
82
83
84
85
86
87
#include <iostream>
#include <cstdlib>
#include <vector>
 
using namespace std;
 
class Matrix
{
private:
    vector<vector<int> > matrix;
    int row;
    int column;
public:
    Matrix(): row(0), column(0){}
    Matrix(int row, int column): row(row), column(column)
    {
        matrix.resize(row, vector<int> (column));
    }
    void EnterMatrix()
    {
        int element;
        for (int i = 0; i < row; i++)
            for (int j = 0; j < column; j++)
            {
                cin >> element;
                matrix[i][j] = element;
            }
    }
    friend Matrix operator+(const Matrix& a, const Matrix& b);
    friend ostream& operator<<(ostream& out, const Matrix& m);
};
Matrix operator+(const Matrix& a, const Matrix& b)
{
    setlocale(LC_ALL, "rus");
    if(a.row != b.row || a.column != b.column || a.row <= 0 || b.row <= 0 || a.column <= 0 || b.column <= 0)
    {
        cout << "Операция не может быть выполнена. Количество строк и столбцов обеих матриц должно совпадать, а также не должно быть равным нулю.";
        exit(1);
    }
    else
    {
        cout << "Сумма матриц равна:" << endl;
        Matrix result(a.row, a.column);
        for(int i = 0; i < a.row; i++)
        {
            for(int j = 0; j < a.column; j++)
            {
                result.matrix[i][j] = a.matrix[i][j] + b.matrix[i][j];
            }
        }
        return result;
    }
}
ostream& operator<<(ostream& out, const Matrix& m)
{
    for(int i = 0; i < m.row; i++)
    {
        for(int j = 0; j < m.column; j++)
            out << m.matrix[i][j] << " ";
        out << endl;
    }
    return out;
}
int main()
{
    setlocale(LC_ALL, "rus");
    cout << "Введите количество строк для первой матрицы: ";
    int r;
    cin >> r;
    cout << "Введите количество столбцов для первой матрицы: ";
    int c;
    cin >> c;
    Matrix mat(r, c);
    mat.EnterMatrix();
    cout << mat;
    cout << "Введите количество строк для второй матрицы: ";
    int r2;
    cin >> r2;
    cout << "Введите количество столбцов для второй матрицы: ";
    int c2;
    cin >> c2;
    Matrix mat2(r2, c2);
    mat2.EnterMatrix();
    cout << mat2;
    cout << mat + mat2;
    return 0;
}
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.10.2017, 23:40
Помогаю со студенческими работами здесь

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

Реализовать функцию сложения матриц
Дорогие друзья у меня такой вопрос я написал класс class Matrix { private: int size; int...

Создать класс Matrix и класс Size
Всем доброго дня!!! Помогите пожалуйста с решением задачи, а то я в программировании плохо...

Создать класс matrix
разработать класс Matrix – матрица, физически представляющая собой вектор, состоящий из заданного...

Создать класс Matrix
Для соответствующего класса, перегрузить арифметические операции(+,-,*,/). При перезгузке...

Создать параметризированный класс Matrix
Создать параметризированный класс Matrix – матрица. Класс должен содержать конструкторы,...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru