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

Перемножение двух матриц

02.10.2015, 19:38. Показов 14099. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Собственно задачка:
Написать программу перемножения двух матриц. Найти вид функции
сложности алгоритма.

2 пункт не обязателен, а вот 1 да. И вот сам вопрос: Я си еще только начал изучать, но как написать, чтобы вместо моего N, он отвечает за размерность обоих матриц, я мог сам вводить размерность каждой матрицы в самом окне проги. Потому что приходится изменять размер именно в коде
А вот и собственно код




C++ (Qt)
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
#include <iostream>
 
 
using namespace std;
 
int main() { //размер матриц
    const int N = 2; // я кривой кодер, из-за этого пишем тут размер матриц
    //индексные переменные
    int i, j, k;
    //первая матрица
    double A[N][N];
    //вторая матрица
    double B[N][N];
    //Третья матрица
    double C[N][N];
    //Ввод (построчный) первой матрицы
    cout << "Matrix A: \n";
    for (i = 0;i<N;i++)
        for (j = 0;j<N;j++)
            cin >> A[i][j];
    //Ввод (построчный) 2 матрицы
    cout << "Matrix B: \n";
    for (i = 0;i<N;i++)
        for (j = 0;j<N;j++)
            cin >> B[i][j];
    //Вычисление произведений матриц
    cout << "Matrix C=AB: \n";
    for (i = 0;i<N;i++)
    {
        for (j = 0;j<N;j++)
        {
            C[i][j] = 0;
            for (k = 0;k<N;k++)
                C[i][j] += A[i][k] * B[k][j];
            //Вывод значения
            cout << C[i][j] << " ";
        }
        cout << endl;
    }
    system("pause");
 
}
Прогерство на MVS 15
Сам код частично украден с интернет ресурсов
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.10.2015, 19:38
Ответы с готовыми решениями:

Перемножение двух матриц
int Multiplication(int a, int b) { cout &lt;&lt; &quot;***********Result***********&quot; &lt;&lt; endl; int c; for(int i = 0; i &lt; 5; i++) // i...

Перемножение двух матриц
Приет.Ребята подскажите как перемножить две матрицы разных размеров используя динамический массив Вот код который получился у меня: ...

Перемножение двух матриц
Написать программу перемножения двух матриц. Использовать динамические массивы. Вот код, но это при условии, что N у всех трех матриц...

5
475 / 427 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
02.10.2015, 19:41
Johny Deagle,
1. Задать изначально размерность переменных матриц больше, чем будет вводить пользователь.
C++
1
2
3
4
double A[200][200];
cin >> n;
for (int i=0; i<n; i++)
...
Но опять же, это не целесообразно, поэтому переходим к пункту 2:
2. Создавать динамические матрицы
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
02.10.2015, 21:58
Johny Deagle, если подойдёт решение в виде класса "Матрица", то вот:

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
#include "Matrix.h"
 
int main()
{
    std::cout << "Please choose number of rows: ";
    int rsize;
    std::cin >> rsize;
    std::cout << "Please choose number of columns: ";
    int csize;
    std::cin >> csize;
    Matrix matrix1(rsize, csize);
 
    matrix1.fill_by_user();
    std::cout << "\nThis is first matrix filled by user:\n"
              << matrix1;
 
    Matrix matrix2(rsize, csize);
    matrix2.fill_rand(10, 90);
    std::cout << "\nThis is second matrix filled by computer:\n"
              << matrix2;
 
    std::cout << "\nThis is the first matrix after multiplication by a second:\n"
              << matrix1 * matrix2;
 
    matrix1 = matrix2;
    std::cout << "\nThis is first matrix after assign to second matrix:\n"
              << matrix1;
 
    return 0;
}


Matrix.h
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
#ifndef MATRIX_H
#define MATRIX_H
 
#include <iostream>
 
typedef double Item;
 
class Matrix
{
private:
    int m_row;
    int m_col;
    Item ** matrix;
 
public:
    explicit Matrix(int row = 2, int col = 2);
    Matrix(const Matrix & m);
    ~Matrix();
 
    void reset();
    void fill_rand(int fromNum, int toNum);
    void fill_by_user();
    Item find_min_value();
    Item find_max_value();
    Item find_avg_value();
 
    Matrix & operator=(const Matrix & m);
    Matrix & operator*(const Matrix & m);
    friend std::ostream & operator<<(std::ostream & os, const Matrix & m);
 
 
};
 
#endif // MATRIX_H


Matrix.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
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
#include "Matrix.h"
#include <ctime>
#include <cstdlib>
 
Matrix::Matrix(int row, int col)
{
    m_row = row;
    m_col = col;
 
    matrix = new Item * [m_row];
    for (int i = 0; i < m_row; ++i)
        matrix[i] = new Item[m_col];
}
 
Matrix::Matrix(const Matrix & m)
{
    m_row = m.m_row;
    m_col = m.m_col;
 
    matrix = new Item * [m_row];
    for (int i = 0; i < m_row; ++i)
        matrix[i] = new Item[m_col];
 
    for (int i = 0; i < m_row; ++i)
        for (int j = 0; j < m_col; ++j)
            matrix[i][j] = m.matrix[i][j];
}
 
Matrix::~Matrix()
{
    for (int i = 0; i < m_row; ++i)
        delete [] matrix[i];
    delete [] matrix;
}
 
void Matrix::reset()
{
    for (int i = 0; i < m_row; ++i)
        for (int j = 0; j < m_col; ++j)
            matrix[i][j] = 0;
}
 
void Matrix::fill_rand(int fromNum, int toNum)
{
    srand(time(0));
    for (int i = 0; i < m_row; ++i)
        for (int j = 0; j < m_col; ++j)
        {
            do
            {
                matrix[i][j] = fromNum + rand()%(toNum - fromNum);
            }
            while (matrix[i][j] == 0);
        }
}
 
void Matrix::fill_by_user()
{
    for (int i = 0; i < m_row; ++i)
        for (int j = 0; j < m_col; ++j)
        {
            std::cout << "\nEnter a value of the element matrix["
                      << i <<"][" << j << "]: ";
            std::cin >> matrix[i][j];
        }
}
 
Item Matrix::find_min_value()
{
    Item min_value = matrix[0][0];
    for (int i = 0; i < m_row; ++i)
        for (int j = 0; j < m_col; ++j)
            if (min_value > matrix[i][j])
                min_value = matrix[i][j];
    return min_value;
}
 
Item Matrix::find_max_value()
{
    Item max_value = matrix[0][0];
    for (int i = 0; i < m_row; ++i)
        for (int j = 0; j < m_col; ++j)
            if (max_value < matrix[i][j])
                max_value = matrix[i][j];
    return max_value;
}
 
Item Matrix::find_avg_value()
{
    Item sum = 0;
    for (int i = 0; i < m_row; ++i)
        for (int j = 0; j < m_col; ++j)
            sum += matrix[i][j];
    return sum / (m_row * m_col);
}
 
Matrix & Matrix::operator=(const Matrix & m)
{
    if (this != &m)
    {
        for (int i = 0; i < m_row; ++i)
            delete [] matrix[i];
        delete [] matrix;
 
        m_row = m.m_row;
        m_col = m.m_col;
 
        matrix = new Item * [m_row];
        for (int i = 0; i < m_row; ++i)
            matrix[i] = new Item[m_col];
 
        for (int i = 0; i < m_row; ++i)
            for (int j = 0; j < m_col; ++j)
                matrix[i][j] = m.matrix[i][j];
    }
 
    return *this;
}
 
Matrix & Matrix::operator*(const Matrix & m)
{
    if (m_row == m.m_row && m_col == m.m_col)
    {
        for (int i = 0; i < m_row; ++i)
            for (int j = 0; j < m_col; ++j)
                matrix[i][j] *= m.matrix[i][j];
    }
 
    return *this;
}
 
std::ostream & operator<<(std::ostream & os, const Matrix & m)
{
    for (int i = 0; i < m.m_row; ++i)
    {
        for (int j = 0; j < m.m_col; ++j)
            os << m.matrix[i][j] << "\t";
        os << "\n";
    }
 
    return os;
}
Миниатюры
Перемножение двух матриц  
0
Модератор
Эксперт С++
 Аватар для zss
13769 / 10962 / 6491
Регистрация: 18.12.2011
Сообщений: 29,236
02.10.2015, 22:22
Умножение матриц
0
1 / 1 / 0
Регистрация: 17.05.2015
Сообщений: 54
03.10.2015, 08:13  [ТС]
Покажите пожалуйста, как через динамические массивы.

Добавлено через 7 часов 35 минут
пожалуйста!
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
03.10.2015, 08:20
Johny Deagle, ты код, который тебе постят, смотришь? А ссылку zss дал кому?

Добавлено через 4 минуты
Создание матрицы (двумерного массива) с динамическим выделением памяти под массивы:
C++
1
2
3
4
5
6
7
8
typedef double Item;    // вместо double можно вписать любой нужный тип (например int)
 
    int row = 3;
    int col = 4;
 
    matrix = new Item * [row];
    for (int i = 0; i < row; ++i)
        matrix[i] = new Item[col];
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.10.2015, 08:20
Помогаю со студенческими работами здесь

Перемножение двух матриц
Yo. У меня проблема с перемножением. Код конечно же написал, но вот в чем проблема. Когда я ввожу элементы матрицы В ( а это 2 матрица), но...

Перемножение двух квадратных целочисленных матриц
Помогите написать прогу: Написать подпрограмму void mult(int a, int b, int c, int N); для перемножения двух квадратных...

Перемножение двух матриц. В ответе большие отрицательные числа
Код написан верно, но при расчете выдает странный результат. Вместо правильных ответов, он прибавляет их к числу -858993460. Чем это...

Перемножение двух матриц, в элементах которых есть ещё матрица
Добрый день, форумчане. Подскажите, пожалуйста, как правильно написать условие для компиляции следующего задания: нужно перемножить две...

Реализовать перемножение двух матриц 2х2 на основании данных варианта задания
2. Реализовать перемножение двух матриц 2х2 на основании данных варианта задания(1 2 3 4 5 6 7 8 ). Результат в виде таблицы значений...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru