С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
1 / 1 / 0
Регистрация: 11.09.2023
Сообщений: 18
1

Создать класс квадратных матриц

11.03.2024, 20:02. Показов 412. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Создать класс квадратных матриц с элементами типа double (матрицы могут быть разных размеров, размер задается при создании
объекта). Класс должен иметь однопараметрический конструктор
для выделения требуемого количества памяти, деструктор, конструктор копии, оператор присваивания и следующие методы:
- заполнение матрицы с клавиатуры;
- заполнение матрицы псевдослучайными числами;
- вывод матрицы на экран;
- вычисление определителя;
- возвращение матрицы, умноженной на заданное число.
Продемонстрировать возможности класса.
Нужна помощь в написании кода.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.03.2024, 20:02
Ответы с готовыми решениями:

Базовый класс Complex и производный класс для реализации квадратных матриц
1) Создайте базовый класс Complex (комплексное число) для реализации комплексных чисел в...

Задать значения вещественным элементам четырех квадратных матриц 5×5 и вычислить сумму квадратов значений той из матриц,
Задать значения вещественным элементам четырех квадратных матриц 5×5 и вычислить сумму квадратов...

Из двух квадратных матриц создать третью, перемножив элементы первых двух согласно условию
Для двух квадратных матриц нужно создать третюю матрицу, элементы которой которой должны равняться...

Создать класс матриц размера 5*5
Создать класс матриц размера 5*5. Членами класса есть элементы матриц.Методами класса: введение...

2
4865 / 2664 / 913
Регистрация: 29.11.2010
Сообщений: 5,746
12.03.2024, 01:01 2
Лучший ответ Сообщение было отмечено zss как решение

Решение

Расчет детерминанта выполнен самым простым рекурсивным методом:
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
#include <iostream>
#include <iomanip>
#include <random>
 
template<typename T>
class Matrix {
public:
    Matrix() : height(0), width(0), data(nullptr) {}
 
    Matrix(size_t size) : height(size), width(size), data(new T[height * width]{}) {}
 
    Matrix(size_t height, size_t width) : height(height), width(width), data(new T[height * width]{}) {}
 
    Matrix(const Matrix<T> &other) : height(other.height), width(other.width), data(new T[height * width]) {
        for (size_t i = 0, size = height * width; i < size; ++i) {
            data[i] = other.data[i];
        }
    }
 
    Matrix(Matrix<T> &&other) noexcept: Matrix() {
        std::swap(height, other.height);
        std::swap(width, other.width);
        std::swap(data, other.data);
    }
 
    Matrix<T> &operator=(Matrix<T> other) {
        std::swap(height, other.height);
        std::swap(width, other.width);
        std::swap(data, other.data);
        return *this;
    }
 
    virtual ~Matrix() {
        delete[] data;
    }
 
    virtual T &operator()(size_t row, size_t col) {
        return data[row * width + col];
    }
 
    virtual const T &operator()(size_t row, size_t col) const {
        return data[row * width + col];
    }
 
    virtual size_t getHeight() const {
        return height;
    }
 
    virtual size_t getWidth() const {
        return width;
    }
 
private:
    size_t height;
    size_t width;
    T *data;
};
 
// минор матрицы -- исходная матрица за вычетом строки и столбца
template<typename T>
class MinorMatrix : public Matrix<T> {
public:
    MinorMatrix(const Matrix<T> &source, std::size_t row, std::size_t col)
        : row(row), col(col), source(source) {}
 
    const T &operator()(std::size_t row, std::size_t col) const override {
        return source(row < MinorMatrix::row ? row : row + 1, col < MinorMatrix::col ? col : col + 1);
    }
 
    std::size_t getHeight() const override {
        return source.getHeight() - 1;
    }
 
    std::size_t getWidth() const override {
        return source.getWidth() - 1;
    }
 
private:
    std::size_t row;
    std::size_t col;
    const Matrix<T> &source;
};
 
template<typename T, typename S>
Matrix<T> operator*(Matrix<T> result, const S &scalar) {
    for (std::size_t i = 0, height = result.getHeight(); i < height; ++i) {
        for (std::size_t j = 0, width = result.getWidth(); j < width; ++j) {
            result(i, j) = result(i, j) * scalar;
        }
    }
    return result;
}
 
template<typename T>
Matrix<T> operator*(const Matrix<T> &a, const Matrix<T> &b) {
    if (a.getWidth() != b.getHeight()) {
        throw std::invalid_argument("the left matrix should have it's width equal to the right matrix height");
    }
    Matrix<T> result(a.getHeight(), b.getWidth());
    for (std::size_t i = 0; i < result.getHeight(); ++i) {
        for (std::size_t j = 0; j < result.getWidth(); ++j) {
            result(i, j) = 0;
            for (std::size_t k = 0; k < a.getWidth(); ++k) {
                result(i, j) += a(i, k) * b(k, j);
            }
        }
    }
    return result;
}
 
template<typename T>
std::ostream &operator<<(std::ostream &out, const Matrix<T> &m) {
    for (std::size_t i = 0; i < m.getHeight(); ++i) {
        for (std::size_t j = 0; j < m.getWidth(); ++j) {
            out << std::fixed << std::setprecision(2) << std::setw(7) << m(i, j);
        }
        out << std::endl;
    }
    return out;
}
 
template<typename T>
std::istream &operator>>(std::istream &in, Matrix<T> &m) {
    for (std::size_t i = 0; i < m.getHeight(); ++i) {
        for (std::size_t j = 0; j < m.getWidth(); ++j) {
            in >> m(i, j);
        }
    }
    return in;
}
 
template<typename T, typename Generator>
Matrix<T> generate(size_t height, size_t width, Generator generate) {
    Matrix<T> result(height, width);
    for (size_t i = 0; i < height; ++i) {
        for (size_t j = 0; j < height; ++j) {
            result(i, j) = generate(i, j);
        }
    }
    return result;
}
 
template<typename T>
T getDeterminant(const Matrix<T> &matrix) {
    if (matrix.getHeight() != matrix.getWidth()) {
        throw std::runtime_error("non-square matrices do not have determinants");
    }
    if (matrix.getHeight() == 1) {
        return matrix(0, 0);
    }
    if (matrix.getHeight() == 2) {
        return matrix(0, 0) * matrix(1, 1) - matrix(0, 1) * matrix(1, 0);
    }
    T result = 0;
    int sign = 1;
    for (std::size_t i = 0; i < matrix.getWidth(); ++i, sign = -sign) {
        result += sign * matrix(0, i) * getDeterminant(MinorMatrix(matrix, 0, i));
    }
    return result;
}
 
int main() {
    std::random_device rd;
    std::mt19937 re(rd());
    std::uniform_real_distribution<double> elementValueDistribution(-9, 9);
    auto randomElementGenerator = [&elementValueDistribution, &re](size_t i, size_t j)->double { return elementValueDistribution(re); };
 
    Matrix<double> randomMatrix = generate<double>(5, 5, randomElementGenerator);
    std::cout << "Random Matrix:\n" << randomMatrix << std::endl;
    std::cout << "Determinant: " << getDeterminant(randomMatrix) << std::endl;
    std::cout << "Multiplied by two:\n" << (randomMatrix * 2) << std::endl;
 
    Matrix<double> matrix(5);
    std::cin >> matrix;
    std::cout << "Matrix Read:\n" << matrix << std::endl;
    std::cout << "Determinant: " << getDeterminant(matrix) << std::endl;
    std::cout << "Multiplied by two:\n" << (matrix * 2) << std::endl;
 
    return 0;
}
2
1 / 1 / 0
Регистрация: 11.09.2023
Сообщений: 18
12.03.2024, 21:21  [ТС] 3
Ой спасибо! вы как-то отвечали на мои просьбы, ещё раз благодарю за отклик, странник!
0
12.03.2024, 21:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.03.2024, 21:21
Помогаю со студенческими работами здесь

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

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

Класс Матрица, создать перегруженный оператор сложения двух матриц
Здравствуйте! Подскажите, пожалуйста, как создать перегруженный оператор сложения двух матриц,...

Создать класс который будет принимать у пользователя длину 2-х матриц
Создать класс который будет принимать у пользователя длину 2-х матриц. Написать метод который будет...

Умножение квадратных матриц
Функция умножения: void Multiplication (int a, int b,int c){ for(int i=0,n=0; i&lt;=N-1&amp;&amp;...

Умножение квадратных матриц
Задача состоит в том, чтобы умножать квадратные матрицы двумя способами, А - записывая в матрицу С....

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


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

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