Форум программистов, компьютерный форум CyberForum.ru

Матрицы - перегрузка оператора * - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Методы и классы http://www.cyberforum.ru/cpp-beginners/thread614348.html
добрый день) код выдает ошибку "E2089 Identifier 'proc' cannot have a type qualifier". не могу понять в чем проблема. int main() { class myclass { int num; public: void proc(); }; void myclass::proc() {
C++ Бинарное дерево (отладка) Прога работает и всё запускает (здесь фрагмент), но, к сожалению, выводит некие символы и т.д. Где что надо поправить? struct prod { char FI; int tnum,date,sum; }; http://www.cyberforum.ru/cpp-beginners/thread614332.html
Мышь да Клава C++
Помогите написать программу, котороя считает каждое нажатие на клавиатуру и мышь.
C++ Написать алгоритм
1. Написать алгоритм, находящий список вершин, находящийся на удалении 3 ребра от заданной вершины 2. Написать алгоритм, находящий в графе список вершин, образующих треугольник. 3. Написать алгоритм, строящий матрицу кратчайших путей для вершины графа, длина каждого ребра равна 1. 4. Выяснить существует ли путь из одной заданной вершины графа в другую заданную вершину. Граф задан: матрицей...
C++ Создать класс http://www.cyberforum.ru/cpp-beginners/thread614307.html
Ребятки пожааааалуйст!!!!!!!!!!Очень-очень прошу напишите как ее решать!!!!Я сама нечерта не понимааю!!! Создайте класс account, который должен хранить номер банковского счета, фамилию вкладчика, сумму на счете, дату открытия счета и дату последней операции. Фамилию вкладчика, дату открытия счета (число/месяц/год) и дату по-следней операции храните в виде символьной строки, а сумму на счете...
C++ Функция для смены обоев рабочего стола Вот хочу написать программу которая автоматически меняет обои рабочего стола. но у меня возникла пару вопросов: 1)WinApi Функция для смены обоев ? я думал применить SystemParametersInfo(); или может вы мне другую посоветуете. 2) Я хочу что бы программа меняла рабочие стол родными картинками windows, у меня возник вопрос, где они расположены в Windows 7 и Windows XP, и одинаково ли картинки... подробнее

Показать сообщение отдельно
Fedor N
 Аватар для Fedor N
0 / 0 / 0
Регистрация: 22.06.2012
Сообщений: 17
02.07.2012, 20:17  [ТС]     Матрицы - перегрузка оператора *
Здравствуйте, дописал я значит функции(работают), но вот с умножением опять беда
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
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <math.h>
//#include <conio.h>
using namespace std;
 
class Matrix {
private:
    // размеры матрицы
    unsigned xsize;
    unsigned ysize;
 
    // указатель на начало массива в динамической памяти
    double *Array;
public:
 
    // функции возвращающие размеры матрицы
 
    unsigned getxsize(void) const {
        return xsize;
    }
 
    unsigned getysize(void) const {
        return ysize;
    }
 
    // конструкторы, которые создают и заполняют матрицу значениями
    Matrix(unsigned y = 1, unsigned x = 1, double v = 0);
    Matrix(const Matrix&);
    Matrix(double);
 
    // деструктор, вывод "!" для отслеживания вызовов
 
    ~Matrix() {
        delete [] Array;
        //cout << "!";
    }
 
    // функция вычисления определителя
    double determinant(const unsigned);
 
    // определитель матрицы
    double minors(const unsigned, const unsigned);
 
    // союзная матрица
    double *cofactor(void);
 
    // транспонирование
    void transpose(const bool);
 
    // обратная матрица
    void inverse(double, const bool);
 
    // вывод матрицы
    void show(void) const;
 
    // последовательный доступ к элементу
    double& operator()(unsigned y, unsigned x);
    double operator()(unsigned y, unsigned x) const;
 
    // перегруженные операции
    Matrix operator*(const Matrix &) const;
    Matrix operator+(const Matrix &) const;
    Matrix operator+(double) const;
    Matrix operator-(const Matrix &) const;
    Matrix operator-(double) const;
};
 
Matrix::Matrix(unsigned x, unsigned y, double v) {
    unsigned asize = (xsize = x) * (ysize = y);
    Array = new double[asize];
 
    for (unsigned i = 0; i < asize; i++)
        Array[i] = rand() % 100;
}
 
Matrix::Matrix(const Matrix& M) {
    unsigned asize = (xsize = M.xsize) * (ysize = M.ysize);
    Array = new double[asize];
 
    for (unsigned i = 0; i < asize; i++)
        Array[i] = M.Array[i];
}
 
Matrix::Matrix(double v) {
    xsize = ysize = 1;
    Array = new double;
    *Array = v;
}
 
void Matrix::show(void) const {
    cout << endl << "{";
 
    for (unsigned i = 0; i < xsize; i++) {
        cout << "{";
        for (unsigned j = 0; j < ysize; j++)
            if (j != ysize - 1)
                cout << (*this)(i, j) << ", ";
            else
                if (j == 0)
                cout << (*this)(i, j);
            else
                cout << (*this)(i, j);
 
        cout << "}";
        if (i != xsize - 1)
            cout << "," << endl;
    }
 
    cout << "}" << endl << endl;
}
 
double &Matrix::operator()(unsigned x, unsigned y) {
    if (y > ysize - 1 || x > xsize - 1) {
        cerr << "Index exceeds matrix dimensions!";
        exit(1);
    }
 
    return Array[x * xsize + y];
}
 
double Matrix::operator()(unsigned x, unsigned y) const {
    if (y > ysize - 1 || x > xsize - 1) {
        cerr << "Index exceeds matrix dimensions!";
        exit(1);
    }
 
    return Array[x * xsize + y];
}
 
// приведение матрицы в верхнетреугольному виду
// определитель матрицы по Гауссу
 
double Matrix::determinant(const unsigned size) {
    double determinan = 1;
    Matrix result(size, size);
 
    for (unsigned i = 0; i < size; i++)
        for (unsigned j = 0; j < size; j++)
            result(i, j) = (*this)(i, j);
 
    for (unsigned i = 0; i < size - 1; i++) {
        double element = result(i, i);
 
        // рабочий элемент корректен - обрабатываем все строки ниже
        if (element) { // если элемент не равен единице
            for (unsigned j = i + 1; j < size; j++)
                for (unsigned k = size - 1; k > i; k--)
                    result(j, k) -= result(i, k) * result(j, i) / element;
 
        } else // ищем строку с ненулевым элементом среди строк, лежащих ниже
            for (unsigned j = i + 1; i < size; i++) {
                element = result(j, i);
                if (element != 0) {
                    // добавляем найденную строку к обрабатываемой строке
                    for (unsigned k = 0; k < size; k++)
                        result(i, k) += result(j, k);
                    break;
                }
            }
    }
 
    for (unsigned i = 0; i < size; i++)
        determinan *= result(i, i);
 
    return determinan;
}
 
// дополнительный минор элемента матрицы n-го порядка есть определитель порядка (n-1),
// соответствующий той матрице, которая получается из матрицы путем вычеркивания i-ой строки и j-го столбца.
 
double Matrix::minors(const unsigned row, const unsigned col) {
    Matrix tmp(*this);
 
    unsigned n = 0;
    for (unsigned i = 0; i < xsize; i++)
        for (unsigned j = 0; j < xsize; j++)
            if (i != row && j != col)
                tmp(n++ / xsize, n % xsize) = (*this)(i, j);
 
    return tmp.determinant(--tmp.xsize);
}
 
// союзная матрица
 
double *Matrix::cofactor(void) {
    double *result = new double[xsize * ysize];
 
    for (unsigned i = 0; i < xsize; i++)
        for (unsigned j = 0; j < ysize; j++)
            result[i * xsize + j] = pow((double) - 1, i + j) * (*this).minors(i, j);
 
    return result;
}
 
// вывод транспонированной союзной матрицы
// второй параметр отвечает за модифицирование массива *this
 
void Matrix::transpose(const bool modify) {
    // создаём два массива типа double
    // 1-ый будет для хранения конечных результатов
 
    // 2-ой для хранения союзной матрицы от матрицы *this,
    // для котороый мы вызвали метод transpose
 
    double *result_cof = new double[xsize * ysize];
 
    for (unsigned i = 0; i < xsize; i++)
        for (unsigned j = 0; j < ysize; j++)
            result_cof[i * xsize + j] = pow((double) - 1, i + j) * (*this).minors(i, j);
 
    // находим союзную матрицу
    //    result_cof = (*this).cofactor();
 
    if (modify) {
        for (unsigned i = 0; i < xsize; i++)
            for (unsigned j = 0; j < ysize; j++) // делаем перестановку элементов
                (*this)(i, j) = result_cof[j * xsize + i];
 
        (*this).show();
    } else {
        Matrix tmp(*this);
 
        for (unsigned i = 0; i < xsize; i++)
            for (unsigned j = 0; j < ysize; j++) // делаем перестановку элементов
                tmp(i, j) = result_cof[j * xsize + i];
 
        tmp.show();
    }
}
 
// вывод обратной матрицы, путём деления матрицы *this на её определитель
// второй параметр отвечает за модифицирование матрицы *this
 
void Matrix::inverse(double determinant, const bool modify) {
    if (!determinant) // если определитель равен нулю, то матрица вырождена
        cout << endl << "matrix is singular" << endl << endl;
    else if (modify) {
        for (unsigned i = 0; i < xsize; i++)
            for (unsigned j = 0; j < ysize; j++)
                (*this)(i, j) /= determinant;
 
        (*this).show();
    } else {
        Matrix tmp(*this);
 
        for (unsigned i = 0; i < xsize; i++)
            for (unsigned j = 0; j < ysize; j++)
                tmp(i, j) = (*this)(i, j) / determinant;
 
        tmp.show();
    }
}
 
// перегруженые операторы
 
Matrix Matrix::operator*(const Matrix& M) const {
    Matrix tmp(*this);
 
    for (unsigned i = 0; i < xsize; i++) {
        for (unsigned j = 0; j < ysize; j++) {
            tmp(i, j) = 0;
 
            for (unsigned k = 0; k < xsize; k++)
                tmp(i, j) += (*this)(i, k) * M(k, j);
        }
    }
 
    return tmp;
}

main.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
#include "Matrixclass.h"
#include <iostream>
#include <stdlib.h>
//#include <conio.h>
 
using namespace std;
 
int main() {
 
    srand((unsigned) time(NULL));
 
    unsigned n = rand() % 3 + 2; // генерирует число от 2 до 5
    bool modify = true;
    double determinant;
 
    Matrix A(n, n);
    cout << "A:";
    A.show();
 
    cout << "Determinant of A:" << endl << (determinant = A.determinant(n)) << endl;
 
    cout << endl << "Output transpose of cofactor of matrix:";
    // если modify равен 1 (true), то матрица А заменится на транспонированную союзную матрицу
    A.transpose(modify);
 
    cout << "Output inverse of matrix:";
    // если modify равен 1 (true), то матрица А заменится на обратну
    A.inverse(determinant, modify);
 
    Matrix B(n, 1);
    cout << "B:";
    B.show();
 
    cout << "A * B:";
    (A * B).show();
 
}
Миниатюры
Матрицы - перегрузка оператора *  
 
Текущее время: 05:48. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru