Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
15 / 15 / 5
Регистрация: 13.11.2011
Сообщений: 65

Непонятное явление при перегрузке умножения в классе матриц

19.12.2011, 15:18. Показов 1343. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
ну собсна есть класс
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
class matrix
{
private:
    int n, m;
    double *p;
public:
    matrix();   
    matrix(int, double [] = NULL);
    matrix(int, int, double [] = NULL);
    matrix(const matrix &);
    ~matrix();
    bool check_plus(const matrix &) const;
    bool check_mult(const matrix &) const;
    double max() const;
    double min() const;
    friend std::ostream &operator <<(std::ostream &, const matrix&);
    const double *operator [](int) const;
    double *operator [](int);
    matrix &operator =(const matrix &);
    matrix &operator +=(const matrix &);
    matrix &operator -=(const matrix &);
    matrix &operator *=(const matrix &);
    matrix &operator *=(double);
};
 
matrix operator +(const matrix &, const matrix &);
matrix operator -(const matrix &, const matrix &);
matrix operator *(const matrix &, const matrix &);
matrix operator *(const matrix &, double);
двухмерный массив хранится в виде одномерного.. все прекрасно работает.. но препод подошел, и написал для проверки умножения
C++
1
matrix z2 = 2*z;
при этом вываливается исключение, прописанное в операции *=
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
matrix &matrix::operator *=(const matrix &a)
{
    if (this->check_mult(a))
    {
        double *tmp;
        tmp = new double[n*a.m];
        for (int i = 0; i < n; i++)
            for (int j = 0; j < a.m; j++)
            {
                tmp[a.m*i+j] = 0;
                for (int k = 0; k < m; k++)
                    tmp[a.m*i+j] += p[i*n+k]*a.p[k*a.m+j];
            }
        for (int i = 0; i < n*a.m; i++)
            p[i] = tmp[i];
        m = a.m;
        return *this;
    }
    else
        throw "Error: wrong sizes";
}
умножение на скаляр у меня перегружается так

C++
1
2
3
4
5
6
matrix operator *(const matrix &a, double k)
{
    matrix tmp(a);
    tmp *= k;
    return tmp;
}
не могу понять в чем дело.. перегрузил умножение скаляра на вектор, но он сказал пока закомментить и решить проблему не создавая

Добавлено через 16 минут
.....
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.12.2011, 15:18
Ответы с готовыми решениями:

Умножение матриц при перегрузке (*) в классе
В чём собственно проблема: При перегрузке умножения, в результирующей матрице выбивает мусор( если быть точным, то максимальное значение...

Непонятное явление при работе с окнами
Писал программу, столкнулся с такой проблемой. При открытии определенного сайта определенным браузером: ShellExecute(Handle, 'open', ...

Непонятное явление при исполнении программы на x86
Народ, не могу понять в чем проблема написал программу правильно, а когда вывожу в TD то запускается без ошибок но значение почему то...

16
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
19.12.2011, 15:39
Тебе нужно еще перегрузить умножение на скаляр так:
C++
1
matrix operator *(double k, const matrix &a);
В текущей реализации все сработало бы, если бы он написал matrix z2 = z*2; ....... :-)
0
15 / 15 / 5
Регистрация: 13.11.2011
Сообщений: 65
19.12.2011, 16:42  [ТС]
ну это то понятно.. я ж писал что так и перегрузил второй раз, но он сказал закомментить и пока не пользоваться второй перегруженной функцией.. правда я так и не понял что ему от меня надо.. либо объяснить, почему не работает умножение при такой записи, тоесть почему оно выдает исключение из другой операции.. либо исправить чото, чтобы оно работало
0
1 / 1 / 0
Регистрация: 24.11.2012
Сообщений: 8
24.11.2012, 11:09
100% лаба Романенко) скорее всего надо объяснить почему не работает.
1
15 / 15 / 5
Регистрация: 13.11.2011
Сообщений: 65
26.11.2012, 08:17  [ТС]
=)) она самая.. ну вроде тогда разобрался, уже и не помню, в чем проблема была)
0
1 / 1 / 0
Регистрация: 24.11.2012
Сообщений: 8
26.11.2012, 14:49
а можно остальной код посмотреть? я просто как двумерный массив ее писала. почерк романенко по количеству констов можно узнать))))
0
15 / 15 / 5
Регистрация: 13.11.2011
Сообщений: 65
26.11.2012, 15:25  [ТС]
сейчас гляну, может осталось)

Добавлено через 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
25
26
27
28
29
30
31
32
33
34
35
36
37
//matrix.h
#pragma once
 
#include <iostream>
 
class matrix
{
private:
    int n, m;
    double *p;
public:
    matrix();   
    explicit matrix(int, double [] = NULL);
    matrix(int, int, double [] = NULL);
    matrix(const matrix &);
    ~matrix();
    bool check_plus(const matrix &) const;
    bool check_mult(const matrix &) const;
    double max() const;
    double min() const;
    friend std::ostream &operator <<(std::ostream &, const matrix&);
    const double *operator [](int) const;
    double *operator [](int);
    matrix &operator =(const matrix &);
    friend matrix &operator +=(matrix &, const matrix &);
    matrix &operator -=(const matrix &);
    matrix &operator *=(const matrix &);
    matrix &operator *=(double);
    matrix operator +(const matrix &) const;
};
 
//matrix operator +(const matrix &, const matrix &);
matrix operator -(const matrix &, const matrix &);
matrix operator *(const matrix &, const matrix &);
matrix operator *(const matrix &, double);
matrix operator *(double, const matrix &);
matrix &operator +=(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
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
//matrix.cpp
 
#include <stdafx.h>
#include "matrix.h"
#include <iostream>
#include <iomanip>
using namespace std;
 
matrix::matrix()
{
    p = NULL;
    n = m = 0;
    cout << "Defaul constructor " << this << endl;
}
matrix::matrix(int a, double arr[])
{
    if (a <= 0 || arr == NULL)
    {
        p = NULL;
        n = m = 0;
        cout << "Wrong arguments, defaul constructor " << this << endl;
    }
    else
    {
        n = a;
        m = a;        
        p = new double[n*m];
        for (int i = 0; i < n*n; i++)
            p[i] = arr ? arr[i] : 0.0;
        cout << "Constructor of square matrix " << n << "x" << m <<" " << this << endl;
    }
}
matrix::matrix(int a, int b, double arr[])
{
    if (a <= 0 || b <= 0 || arr == NULL)
    {
        p = NULL;
        n = m = 0;
        cout << "Wrong arguments, defaul constructor " << this << endl;
    }
    else
    {
        n = a;
        m = b;
        p = new double[n*m];
        for (int i = 0; i < n*m; i++)
            p[i] = arr != NULL ? arr[i] : 0.0;
        cout << "Constructor of rectangular matrix " << n << "x" << m <<" " << this << endl;
    }
}
matrix::matrix(const matrix &a)
{
    if (a.p != NULL)
    {
        n = a.n;
        m = a.m;
        p = new double[n*m];
        for (int i = 0; i < n*m; i++)
            p[i] = a.p[i];
    }
    else
    {
        p = NULL;
        n = m = 0;
    }
    cout << "Copy constructor " << this << endl;
}
 
matrix::~matrix()
{
    if(p != NULL) delete [] p;
    cout << "Default destructor " << this << endl;
}
bool matrix::check_plus(const matrix &a) const
{   
        return a.n == n && a.m == m;
}
bool matrix::check_mult(const matrix &a) const
{
    return a.m == n;
}
double matrix::max() const
{
    if (p != NULL)
    {
        double max = p[0];
        for (int i = 0; i < n*m; i++)
        {
            if (p[i] > max)
                max = p[i];
        }
        return max;
    }
    else
        throw "Matrix is empty";    
}
double matrix::min() const
{
    if (p != NULL)
    {
        double min = p[0];
        for (int i = 0; i < n*m; i++)
        {
            if (p[i] < min)
                min = p[i];
        }
        return min;
    }
    else
        throw "Matrix is empty";
}
std::ostream &operator <<(std::ostream& out, const matrix &c)
{
    for (int i = 0; i < c.n; i++)
    {
        for (int j = 0; j < c.m; j++) {
            out << setw(4) << c[i][j];
        }
        out << endl;
    }
    return out;
}
 
const double *matrix::operator [](int a) const
{
    if (a < 0 || a >= n)
        throw "Error: wrong string number";
    else
        return &p[a*m];
}
double *matrix::operator [](int a)
{
    if (a < 0 || a >= n)
        throw "Error: wrong string number";
    else
        return &p[a*m];
}
 
matrix &matrix::operator =(const matrix &a)
{
    if (this == &a) return *this;
    if (a.n*a.m != n*m)
    {
        if(p != NULL) delete [] p;
        p = a.m*a.n == 0 ? NULL : new double[a.m*a.n];
    }
    m = a.m;
    n = a.n;
    for (int i = 0; i < n*m; i++)
        p[i] = a.p[i];        
    return *this;
}
matrix &operator +=(matrix &a, const matrix &b)
{
    if(a.check_plus(b))
    {
        for (int i = 0; i < (a.m*a.n); i++)
                a.p[i] += b.p[i];
        return a;
    }
    else
        throw "Error: wrong sizes";
}
 
matrix &matrix::operator -=(const matrix &a)
{
    if(this->check_plus(a))
    {
        for (int i = 0; i < (m*n); i++)
            p[i] -= a.p[i];
        return *this;
    }
    else
        throw "Error: wrong sizes";
}
 
 
matrix &matrix::operator *=(const matrix &a)
{
    if (this->check_mult(a))
    {
        double *tmp;
        tmp = new double[n*a.m];
        for (int i = 0; i < n; i++)
            for (int j = 0; j < a.m; j++)
            {
                tmp[a.m*i+j] = 0;
                for (int k = 0; k < m; k++)
                    tmp[a.m*i+j] += p[i*n+k]*a.p[k*a.m+j];
            }
        for (int i = 0; i < n*a.m; i++)
            p[i] = tmp[i];
        m = a.m;
        return *this;
    }
    else
        throw "Error: wrong sizes";
}
 
 
matrix &matrix::operator *=(double k)
{
    for (int i = 0; i < n*m; i++)
        p[i] *= k;
    return *this;
}
 
matrix matrix::operator +(const matrix &b) const
{
    matrix tmp(b);
    tmp += *this;
    return tmp;
}
matrix operator -(const matrix &a, const matrix &b)
{
    matrix tmp(a);
    tmp -= b;
    return tmp;
}
matrix operator *(const matrix &a, const matrix &b)
{
    matrix tmp(a);
    tmp *= b;
    return tmp;
}
 
matrix operator *(const matrix &a, double k)
{
    matrix tmp(a);
    tmp *= k;
    return tmp;
}
 
matrix operator *(double k, const matrix &a)
{
    matrix tmp(a);
    tmp *= k;
    return tmp;
}
Добавлено через 51 секунду
это уже с какими-то его дополнительными заданиями, не оригинал, там вон перегрузка сложения закомменчена, не помню зачем)
1
1 / 1 / 0
Регистрация: 24.11.2012
Сообщений: 8
26.11.2012, 20:02
огромное спасибо. [удалено]
0
1 / 1 / 0
Регистрация: 24.11.2012
Сообщений: 8
04.12.2012, 15:44
а как Вы выполняли третью лабу, там же ясно было сказано, что матрицу представить как двумерный массив, а вектор - как одномерный. Матрицу брали как основу, а вектор представляли матрицей-строкой?
0
15 / 15 / 5
Регистрация: 13.11.2011
Сообщений: 65
04.12.2012, 15:55  [ТС]
хм.. у нас вроде нужно было через одномерный массив делать.. или это был один из вариантов) я не помню) кажется всё-таки было несколько вариантов выполнения на выбор) я через одномерный сделал)
0
1 / 1 / 0
Регистрация: 24.11.2012
Сообщений: 8
04.12.2012, 16:03
хм... интересно. а получилось так же красиво? просто вариант решения, который вы представили выше, намного короче, чем мой, сделанный через двумерный. что вызвало полный восторг)))
0
15 / 15 / 5
Регистрация: 13.11.2011
Сообщений: 65
04.12.2012, 16:17  [ТС]
я с двухмерным даже не представляю, как делать.. точнее, если подумать, то придумал бы, но это как-то не так.. там даже аргументы были какие-то вроде в пользу одномерного.. может быть, как раз-таки, размер кода))
0
1 / 1 / 0
Регистрация: 24.11.2012
Сообщений: 8
04.12.2012, 16:22
а можешь показать? хотя бы интерфейс. я лично представляла вектор как матрицу, размером 1*n. то есть строку. ну и там куча кода, да. особенно пришлось париться с иерархией
0
15 / 15 / 5
Регистрация: 13.11.2011
Сообщений: 65
04.12.2012, 16:27  [ТС]
хм.. а что еще показывать, не пойму?) я вроде весь код скинул) мож у нас лабы разные?)
0
1 / 1 / 0
Регистрация: 24.11.2012
Сообщений: 8
04.12.2012, 16:29
в третьей как с вектором совместил
0
15 / 15 / 5
Регистрация: 13.11.2011
Сообщений: 65
04.12.2012, 16:37  [ТС]
что-то я не могу там разобраться..
вот тебе весь архив с лабой, гляди сама)) а то я не помню совсем ничего оттуда)
Вложения
Тип файла: zip 3.zip (1.21 Мб, 4 просмотров)
0
1 / 1 / 0
Регистрация: 24.11.2012
Сообщений: 8
04.12.2012, 17:07
благодарю, пошла ковыряться) =)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.12.2012, 17:07
Помогаю со студенческими работами здесь

Ошибка при перегрузке операторов в классе
Я создал класс myNVector для работы с векторами произвольного размера: в заголовочном файле: class myNVector { public: ...

Непонятное явление с колонками
Есть 2 колонки - активная и пассивная. Активная колонка питается от usb и подключается через разъём 3.5 мм к звуковой плате, пассивная...

Непонятное явление с заголовком формы
Привет всем, делал прогу, всё супер, закончил, и вот остался один штрих- заголовок формы! Пишу в свойства Caption название заголовка, и...

Непонятное явление выбор страниц на сайте
или я глючу) но не понятно почему так происходит... вот часть кода: &lt;?php ........ else { $city=$_GET; $preparate=$_GET; ...

Электричество из пара (не задача, непонятное явление)
Есть стальная заземлённая труба, в которой пар давлением около 6-7 кгс/см2. Также в трубе всегда есть некоторое количество парового...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru