8 / 8 / 9
Регистрация: 23.09.2015
Сообщений: 283
1

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

18.07.2016, 11:04. Показов 11869. Ответов 11
Метки нет (Все метки)

Создайте класс Matrix на базе вектора vector<vector<int>>. Определите операторную функцию ostream& operator<<(ostream&, const Matrix&) для вывода матрицы. Создайте следующие бинарные операторные функции, по возможности используя объекты функций STL: operator+(const Matrix&, const Matrix&) для сложения матриц, operator*(const Matrix&, const vector<int>&) для умножения матрицы на вектор, operator*(const Matrix&, const Matrix&) для умножения матриц. Продемонстрируйте работу функций на примере.


В общем проблема с реализацией заполнение вектора,потом с реализацией 2-х методов(умножения) и с вводом размера матрицы.Помогите п-жлст

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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#include<vector>
#include<iostream>
using namespace std;
 
class Matrix
{
private:
    vector<vector<int>> Mat;
    Matrix() {};
public:
    Matrix(vector<vector<int>> mat) : Mat(mat) {};//Конструктор
    ~Matrix() {};
    Matrix(const Matrix &rhs);
 
 
    int getnum(int r, int c)const 
    { 
        return Mat[r][c]; 
    };
 
    int getrow()const 
    {
        return (Mat.size()); 
    };
 
    int getcol()const 
    { 
        return (Mat[0].size()); 
    };
 
    //операторы
    friend ostream & operator<<(ostream &os, const Matrix &rhs);
    Matrix Matrix::operator+(const Matrix &rhs);
    Matrix &operator=(const Matrix &rhs);
    //Matrix &operator*(const Matrix &lhs, const Matrix &rhs);
    //Matrix &operator*(const Matrix &lhs, const vector<int> &rhs);
    
};
ostream &operator<<(ostream &os, const Matrix &rhs)
{
    for (int i=0; i < rhs.getrow(); ++i)
    {
        for (int j=0; j < rhs.getcol(); ++j)
            os << rhs.getnum(i, j) << '\t';
        os << endl;
    }
    return os;
}
Matrix Matrix::operator+(const Matrix &rhs)
{
    vector<vector<int>> temp(getrow(), vector<int>(getcol(), 0));
    Matrix Temp(temp);
    if ((getrow() != rhs.getrow()) || (getcol() != rhs.getcol()))
    {
        cout << "Размеры матриц не совпадают." << endl;
        system("pause");
        exit(1);
    }
    for (unsigned int i=0; i < Temp.getrow(); i++)
        for (unsigned int j=0; j < Temp.getcol(); j++)
            Temp.Mat[i][j] = getnum(i, j) + rhs.getnum(i, j);
    return Temp;
}
Matrix &Matrix::operator=(const Matrix &rhs)
{
    cout << rhs.getrow() << endl;
    this->Mat.resize(rhs.getrow());
    for (int i=0; i < this->getrow(); ++i)
        this->Mat[i].resize(rhs.getcol());
    for (int i(0); i < this->getrow(); ++i)
        for (int j=0; j < this->getcol(); ++j)
            this->Mat[i][j] = rhs.Mat[i][j];
    return *this;
}
 
Matrix::Matrix(const Matrix &rhs)
{
    Mat = rhs.Mat;
}
int main()
{
    setlocale(LC_ALL, "rus");
    int n, n1;
    cin >> n >> n1;
    vector<vector<int>> A(n, vector<int>(n1, 0));
    vector<vector<int>> B(n, vector<int>(n1, 0));
    vector<vector<int>> C(1,vector<int>(1, 0));
    for (int i=0; i <n1; ++i)
        for (int j=0; j <n; ++j)
        {
            A[i][j] = i;
            B[j][i] = i;
        }
    Matrix test(A);
    Matrix test2(B);
    Matrix test3(C);//сложение
 
    /*
    Matrix test4(D);//умножение матриц
    Matrix test5(E);//умножение матрицы на вектор
    */
 
    cout << "Первая матрица:" << endl << test << " " << endl;
    cout << "Вторая матрица:" << endl << test2 << " " << endl;
    test3 = test + test2;
    cout<<"Сложение 1 и 2:"<<endl << test3;
 
    system("pause");
    return 0;
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.07.2016, 11:04
Ответы с готовыми решениями:

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

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

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

Функции сложения матриц и умножения матриц на число
Найти k – количество нечетных чисел ниже побочной диагонали матрицы T и m – количество нечетных...

11
257 / 234 / 185
Регистрация: 02.04.2016
Сообщений: 898
18.07.2016, 11:08 2
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#include <iostream>
#include <clocale>
#include <cstdlib>
#include <ctime>
//
// Создание матрицы
//
int ** Create( size_t n, size_t m ) {
    int ** M = new int * [n];
    for ( size_t i = 0; i < n; ++i ) {
        M[i] = new int [m];
    }
    return M;
}
//
// Удаление матрицы
//
void Free( int ** M, size_t n ) {
    for ( size_t i = 0; i < n; ++i ) {
        delete [] M[i];
    }
    delete [] M;
}
//
//---- ввод матрицы--------------------------------------
//
void Input( int ** M, size_t n, size_t m ) {
    for ( size_t i = 0; i < n; ++i ) {
        for ( size_t j = 0; j < m; ++j ) {
            std::cout << "M[" << i << "][" << j << "] = ";
            std::cin >> M[i][j];
        }
    }
}
//
// заполнение матрицы случайными числами из диапазона [0, 99] -----------
//
void FillRandomNumbers(int **matrix, const size_t rows, const size_t columns)
{
    srand((unsigned int)time(0)); // инициализируем ПГСЧ
 
    for (size_t row=0; row < rows; row++)
        for (size_t column=0; column < columns; column++)
            matrix[row][column] = rand() % 100; // присваиваем СЧ
}
//
//-------- Печать матрицы ------------------------------------------------
//
void Print( int ** M, size_t n, size_t m ) {
    for ( size_t i = 0; i < n; ++i ) {
        for ( size_t j = 0; j < m; ++j ) {
            std::cout<<M[i][j]<<' ';
        }
        std::cout<<std::endl;
    }
}
//
// пример обработки матрицы - подсчет сумм в каждой строке
//
void Process( int ** M,int *Sum, size_t n, size_t m ) {
    for ( size_t i = 0; i < n; ++i ) {
        Sum[i] = 0;
        for ( size_t j = 0; j < m; ++j ) {
            Sum[i] += M[i][j];
        }
    }
}
 
// ...
// сюда вставить все дополнительные функции которые напишете
// ...
 
int main()
{
    //setlocale( LC_ALL, "Rus" ); // установление русской локали (windows)
 
    size_t n, m;
 
    // вводим размерность матрицы
    std::cout << "Введите количество строк матрицы: ";
    std::cin >> n;
    std::cout << "Введите количество столбцов матрицы: ";
    std::cin >> m;
 
    // выделяем память под матрицу
    int ** A = Create( n, m );
 
    // ввод матрицы
    //Input( A, n, m );
    // заполнение случайными числами (вместо ввода)
    FillRandomNumbers(A,n,m);
 
    // обработка матрицы
    int* S=new int[n]; // Вектор результата
    Process( A, S, n, m );
 
    // вывод результата
    for(size_t i=0;i<n;i++) 
        std::cout<< S[i] <<' ';
    std::cout<<std::endl;
 
    // Вывод матрицы
    Print(A,n,m);
 
    // освобождаем память, выделенную под матрицу и вектор
    delete[] S;
    Free( A, n );
 
    // ждём нажатия клавиши перед выходом из приложения (windows)
    //system( "pause" );
 
    return 0;
}
0
8 / 8 / 9
Регистрация: 23.09.2015
Сообщений: 283
18.07.2016, 12:49  [ТС] 3
shilko2013, так вроде про заполнение вектора ничего нету,да и методов умножения тоже)

Добавлено через 58 минут
heelp

Добавлено через 41 минуту
0
257 / 234 / 185
Регистрация: 02.04.2016
Сообщений: 898
18.07.2016, 12:56 4
Я бы сделал по-другому сам класс и конструктор.
0
8 / 8 / 9
Регистрация: 23.09.2015
Сообщений: 283
18.07.2016, 12:58  [ТС] 5
shilko2013, именно через класс?
0
257 / 234 / 185
Регистрация: 02.04.2016
Сообщений: 898
18.07.2016, 13:08 6
Смотрите.. Конструктор типа этого
C++
1
2
3
4
5
Matrix (int n, int m) {
v.reserve(n); //строки
for (int i=0;i<n;++i) //столбцы
     v[i].reserve(m);
}
Получается массив v[n][m], которым можно пользоваться далее.
0
8 / 8 / 9
Регистрация: 23.09.2015
Сообщений: 283
18.07.2016, 13:10  [ТС] 7
shilko2013, "v",я так полагаю вектор?Разве не нужно его тоже передавать,как n и m?
0
257 / 234 / 185
Регистрация: 02.04.2016
Сообщений: 898
18.07.2016, 13:15 8
Вот деструктор
C++
1
2
3
4
5
~Matrix () {
for (int i=0;i<n;++i) //столбцы
     v[i].clear();
v.clear();
}
Добавлено через 44 секунды
Надо хранить количество столбцов

Добавлено через 3 минуты
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
class Matrix {
private:
    vector<vector<int>> v;
    int n,m; //количество строк и столбцов для проверки за выхоьд за грани массива потом
public:
    Matrix(int nn, int mm) { //создаем
        v.reserve(nn); //строки
        for (int i = 0; i<nn; ++i) //столбцы
            v[i].reserve(mm);
        n = nn;
        m = mm;
    }
    ~Matrix() {
        for (int i = 0; i<n; ++i)
            v[i].clear();
        v.clear();
    }
};
int main() {
    
    Matrix a(5, 5); //матрица 5*5
 
    return 0;
}
Добавлено через 41 секунду
Функции внутри класса теперь как для обычного двумерного массива v пиши и все.
0
8 / 8 / 9
Регистрация: 23.09.2015
Сообщений: 283
18.07.2016, 13:15  [ТС] 9
shilko2013, ммм
0
257 / 234 / 185
Регистрация: 02.04.2016
Сообщений: 898
18.07.2016, 13:16 10
В конструкторе можно еще проверить nn и mm на положительность, мало ли что...

Добавлено через 10 секунд
Нравится?
0
8 / 8 / 9
Регистрация: 23.09.2015
Сообщений: 283
18.07.2016, 13:16  [ТС] 11
shilko2013, спасибо)

Добавлено через 19 секунд
shilko2013, ну да, меньше воды)
0
257 / 234 / 185
Регистрация: 02.04.2016
Сообщений: 898
18.07.2016, 13:21 12
Там можно не reserve, а resize в двух местах.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.07.2016, 13:21
Помогаю со студенческими работами здесь

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

Класс: Матрица (n x m). Поля: размерность и значение матрицы. Реализовать методы сложения и умножения матриц
Нужно сделать с использованием конструкторов и методов доступа, а я не могу понять как это,...

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

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


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

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

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