Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.74/34: Рейтинг темы: голосов - 34, средняя оценка - 4.74
0 / 0 / 0
Регистрация: 09.11.2014
Сообщений: 19

Умножение матриц с использованием классов

16.03.2016, 21:15. Показов 7156. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Написал простенькую программу для умножения 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
#include "stdafx.h"
#include "iostream"
#include "conio.h"
using namespace std;
class matrix
{
private:
    int **mas, size;
public:
    matrix () : size(0){}
    ~matrix ()
    {
 
    }
    matrix mul(matrix ob1,matrix ob2);
    void getmat()
    {
         mas = new int*[size];
        for (int i = 0; i<size;i++)
        {
            mas[i] = new int[size];
        }
        for (int i = 0; i < size; i++)
        {
            for (int j = 0; j < size; j++)
            {
                cin>>mas[i][j];
            }
        }
    }
    void getsize (int n1)
    {
        size=n1;
    }
    void masout()
    {
         for (int i = 0; i < size; i++)
        {
            for (int j = 0; j < size; j++)
            {
                cout<<mas[i][j]<<"  ";
            }cout<<endl;
         }}
 
 
}obj1,obj2,obj3,result;
 
matrix matrix::mul(matrix ob1,matrix ob2)
{
    matrix result;
    int i,j,k;
 
    for(k=0; k<size;k++)
    {
        for(i=0;i<size;i++)
     {       for(j=0;j<size;j++)
      {          result.mas[k][i]+= ob1.mas[k][j] * ob2.mas[j][i];
        }}}  
    return result;
}
 
 
void main ()
{
    int n;
    cout<<"Type size for mas1: ";cin>>n;
    obj1.getsize(n);
    obj1.getmat();
    cout<<"Type size for mas2: ";cin>>n;
    obj2.getsize(n);
    obj2.getmat();
    cout<<"MAS1: \n";
    obj1.masout();
    cout<<"MAS2: \n";
    obj2.masout();
    result=obj3.mul(obj1,obj2);
    result.masout();
    _getch();
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.03.2016, 21:15
Ответы с готовыми решениями:

Умножение матриц разных классов
Допустим есть 2 класса, описывающих матрицы А и Б, как произвести с ними арифметические операции(сложение, умножение)?

Умножение матриц с использованием OpenMP
Здрасте. Есть следующая задача. Нужно реализировать умножение двух квадратных матриц с использованием OpenMP. Без него все пашет нормально,...

Ленточное умножение матриц с использованием MPI
Помогите разобраться, почему в результирующей матрице С диагональные элементы считаются неправильно? Код взят отсюда. void InitProcess...

7
17.03.2016, 06:34

Не по теме:

Цитата Сообщение от ex1t3 Посмотреть сообщение
Написал простенькую программу для умножения 2ух матриц. Все работает, собственно, кроме умножения.
Интересный подход (в этом что-то есть) :)

0
93 / 69 / 22
Регистрация: 17.10.2011
Сообщений: 235
17.03.2016, 11:56
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
#include <iostream>
#include <vector>
 
class Matrix {
    size_t C;
    size_t R;
    std::vector<int> data;
 public:
    Matrix(size_t R, size_t C) : C(C), R(R), data(R*C) {}
    size_t Columns(){ return C;}
    size_t Rows(){ return R;}
    int operator()(size_t r, size_t c) const {
        return data[r*C+c];
    }
    int& operator()(size_t r, size_t c) {
        return data[r*C+c];
    }
    Matrix operator*(Matrix &M){
        Matrix tmp(R,M.C);
        for(size_t i=0;i<R;i++){
            for(size_t j=0;j<M.C;j++){
                for(size_t k=0;k<C&&k<M.R;k++){
                    tmp(i,j)+=(*this)(i,k)*M(k,j);
                }
            }
        }
        return tmp;
    }
    friend std::ostream &operator<<(std::ostream &, Matrix&);
};
 
std::ostream &operator<<(std::ostream &out, Matrix &m)
{
   for(size_t i=0;i<m.R;i++){
    for(size_t j=0;j<m.C;j++)
     std::cout<<m(i,j)<<" ";
    std::cout<<std::endl;
   }
 
   return out;
}
 
int main() {
    Matrix A(2,2);
    A(0,0)=1; A(0,1)=1;
    A(1,1)=1;
    std::cout<<A;
    
    Matrix B(2,3);
    B(0,0)=1;   B(0,1)=2; B(0,2)=3;
    B(1,0)=6;   B(1,1)=5; B(1,2)=4;
    std::cout<<B;
    
    Matrix C=A*B;
    std::cout<<C;
    
    return 0;
}
вообще не хотелось new писать, поэтому vector
1
0 / 0 / 0
Регистрация: 09.11.2014
Сообщений: 19
18.03.2016, 00:04  [ТС]
vndtta, сказал спасибо за потраченное время, сир. Но мне бы обойтись без перегрузки, ну и дружеские ф-ции я тоже не использовал
0
93 / 69 / 22
Регистрация: 17.10.2011
Сообщений: 235
21.03.2016, 09:07
в общем и целом, у тебя в коде ошибка - при инициализации obj3 obj3:size=0, поэтому в результате 0 строк в выводе
0
0 / 0 / 0
Регистрация: 09.11.2014
Сообщений: 19
21.03.2016, 23:43  [ТС]
vndtta, допустим, что мне делать? Буду очень признателен, если поможешь довести дело до конца
0
93 / 69 / 22
Регистрация: 17.10.2011
Сообщений: 235
22.03.2016, 14:46
Лучший ответ Сообщение было отмечено ex1t3 как решение

Решение

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
//#include "stdafx.h"
//#include "iostream"
//#include "conio.h"
#include <iostream>
using namespace std;
class matrix
{
private:
    int *mas;
    int size;
public:
    matrix (int s=0) : size(s){
        mas=0;
        setsize(s);
    }
    ~matrix ()
    {
        if (mas)
            delete mas;
    }
    matrix& mul(matrix &ob1,matrix &ob2);
    void getmat()
    {
        for (int i = 0; i < size; i++)
        {
            for (int j = 0; j < size; j++)
            {
                cin>>mas[i*size+j];
            }
        }
    }
    void setsize (int n1)
    {
        size=n1;
        if (mas)
            delete mas;
        mas = new int[size*size];
    }
    int getsize(){return size;}
    void masout(){
        for (int i = 0; i < size; i++){
            for (int j = 0; j < size; j++){
                cout<<mas[i*size+j]<<"  ";
            }
            cout<<endl;
        }
    }
 
 
}obj1,obj2,obj3,result;
 
matrix& matrix::mul(matrix& ob1,matrix& ob2)
{
    this->setsize(min(ob1.getsize(),ob2.getsize()));
 
    for(int k=0; k<size;k++){
        for(int i=0;i<size;i++){
            this->mas[k*size+i]=0;
            for(int j=0;j<size;j++){
                this->mas[k*size+i] += ob1.mas[k*size+j] * ob2.mas[j*size+i];
            }
        }
    }  
    return *this;
}
 
 
int main ()
{
    int n;
    cout<<"Type size for mas1: ";cin>>n;
    obj1.setsize(n);
    obj1.getmat();
    cout<<"Type size for mas2: ";cin>>n;
    obj2.setsize(n);
    obj2.getmat();
    cout<<"MAS1: \n";
    obj1.masout();
    cout<<"MAS2: \n";
    obj2.masout();
    obj3.setsize(min(obj1.getsize(),obj2.getsize()));
    //obj3.mul(obj1,obj2);
    cout<<"obj3"<<endl;obj3.mul(obj1,obj2).masout();
    //_getch();
}
правда этот вариант мне не нравится (из-за new и delete), если использовать(matrix)a=(matrix)b, то придется перегружать operator= либо, не использовать его
0
0 / 0 / 0
Регистрация: 09.11.2014
Сообщений: 19
22.03.2016, 23:23  [ТС]
vndtta, спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.03.2016, 23:23
Помогаю со студенческими работами здесь

Умножение треугольных матриц«Методы обработки разреженных матриц»
Нужно перемножить треугольные матрицы в обычном виде и в свёрнутом. С обычным проблем нет. Доступ к элементам свёрнутой матрицы...

Шаблоны классов (умножение классов)
Прошу помочь, нужно создать шаблон для умножения значений 2-х классов. Умножить классы просто получается, а вот с шаблонами какая то...

Умножение матриц
complex &lt;double&gt; c; for (int r = 0; r &lt; 4; r++) for (int col = 0; col &lt; 8; col++) for (int i =...

Умножение матриц
Есть 2 функции перемножения квадратных матриц N*N вторая функция транспонирует вторую матрицу для того, чтобы перемножение шло строка на...

Умножение матриц
Доброго времени суток:) Помогите пожалуйста в написании программы. Пользователь вводит Матрицу А(размер 2х2) и Матрицу В(размер 2х2). ...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru