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

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

Восстановить пароль Регистрация
 
Johny Deagle
1 / 1 / 0
Регистрация: 17.05.2015
Сообщений: 54
09.10.2015, 21:48     Перемножение двух матриц #1
Написать программу перемножения двух матриц. Использовать динамические массивы.

Вот код, но это при условии, что N у всех трех матриц одна и та же, с М такая же фигня. Но я не знаю как написать так, чтобы, например для 1 - ой матрицы N = 2 , M = 3, а для 2 матрицы N = 3, M = 2, тогда получается, что у 3 матрицы выйдет 3х3 размер. Вот как это я написать не знаю , подскажите или помогите с кодом.

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
43
#include <iostream>
using namespace std;
int main()
{
    setlocale(LC_ALL, "RUS");
    int i, j, N, M; double *a, *b, *c;
    //ввод размеров матрицы
    cout << "N = "; cin >> N;
    cout << "M = "; cin >> M;
    //выделение памяти для матриц
    a = new double[N*M];
    b = new double[N*M];
    c = new double[N*M];
    //ввод матрицы А
    cout << "введите матрицу А" << endl;
    for (i = 0; i<N; i++)
        for (j = 0; j<M; j++)
        {
            cin >> *(a + i*M + j);
        }
    //ввод матрицы B
    cout << "введите матрицу B" << endl;
    for (i = 0; i<N; i++)
        for (j = 0; j<M; j++)
        {
            cin >> *(b + i*M + j);
        }
    //вычисление матрицы C=A+B
    for (i = 0; i<N; i++)
        for (j = 0; j<M; j++)
            *(c + i*M + j) = *(a + i*M + j) + *(b + i*M + j);
    //ввод матрицы С
    cout << "матрица С:" << endl;
    for (i = 0; i<N; cout << endl, i++)
        for (j = 0; j<M; j++)
            cout << *(c + i*M + j) << "\t";
    //освобождение памяти
    delete[]a;
    delete[]b;
    delete[]c;
    system("pause");
    return 0;
}

Кликните здесь для просмотра всего текста
Попытки сделать, но это бред

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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <iostream>
using namespace std;
int main()
{
    setlocale(LC_ALL, "RUS");
    int i, j,o,p,l,f ,N, M,C,L,K,E,ONE,TWO; double *a, *b, *c;
    //ввод размеров матрицы
    cout << "N = "; cin >> N;
    cout << "M = "; cin >> M;
    cout << "C = "; cin >> C;
    cout << "L = "; cin >> L;
    ONE = N;
    TWO = M;
    //выделение памяти для матриц
    a = new double[N*M];
    b = new double[C*L];
    
    //ввод матрицы А
    cout << "введите матрицу А" << endl;
    for (i = 0; i<N; i++)
        for (j = 0; j<M; j++)
        {
            cin >> *(a + i*M + j);
        }
    //ввод матрицы B
    cout << "введите матрицу B" << endl;
    for (o = 0; o<C; o++)
        for (p = 0; p<L; p++)
        {
            cin >> *(b + o*L + p);
        }
    //вычисление матрицы C=A+B
    if (ONE > TWO)
    {
        c = new double[ONE*ONE];
        for (l = 0; l < ONE; l++)
            for (f = 0; f < ONE; f++)
                *(c + i*ONE + f) = *(a + i*N + j) + *(b + o*C + p);
        cout << "матрица С:" << endl;
        for (l = 0; l<ONE; cout << endl, l++)
            for (f= 0; f<ONE; f++)
                cout << *(c + l* +f) << "\t";
    }
    else
    {
        c = new double[TWO*TWO];
        for (l = 0; l < TWO; l++)
            for (f = 0; f < TWO; f++)
                *(c + i*TWO + f) = *(a + i*N + j) + *(b + o*C + p);
        cout << "матрица С:" << endl;
        for (l = 0; l<TWO; cout << endl, l++)
            for (f = 0; f<TWO; f++)
                cout << *(c + l* +f) << "\t";
    }
    
    
    
    
        
    //освобождение памяти
    delete[]a;
    delete[]b;
    delete[]c;
    system("pause");
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5956 / 5561 / 1788
Регистрация: 18.12.2011
Сообщений: 14,215
Завершенные тесты: 1
09.10.2015, 22:05     Перемножение двух матриц #2
См. ссылки внизу страницы.
Johny Deagle
1 / 1 / 0
Регистрация: 17.05.2015
Сообщений: 54
10.10.2015, 00:28  [ТС]     Перемножение двух матриц #3
Я смотрел, изучал. Но мне многое не понятно, сам си изучаю меньше месяца, а тут такие коды, которые мне не известны, да и если преподавателю покажу, он все сразу поймет. А мне просто нужна помощь с тем, как вводить матрицы, например 3х2 и 2х3, чтобы 3 матрица была 3х3. А то у меня только N и M для всех,а как изменить - не получается
Dimension
Dimension
547 / 428 / 132
Регистрация: 08.04.2014
Сообщений: 1,694
Завершенные тесты: 1
10.10.2015, 01:03     Перемножение двух матриц #4
попробуйте создать другие переменные для размера второй матрицы ,либо просто во втором цикле местами поменяйте N и M
gru74ik
Модератор
 Аватар для gru74ik
3131 / 1357 / 168
Регистрация: 20.02.2013
Сообщений: 3,877
Записей в блоге: 18
10.10.2015, 08:40     Перемножение двух матриц #5
Johny Deagle, такие вещи лучше делать с помощью функций. А ещё лучше - с помощью классов. Иначе будет простыня кода с многочисленным дублированием кода, а это плохой стиль программирования.

Добавлено через 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
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <windows.h>
 
int ** create_matrix(int row, int col)
{
    int ** matrix = new int * [row];
    for (int i = 0; i < row; ++i)
        matrix[i] = new int[col];
 
    return matrix;
}
 
void delete_matrix(int ** matrix, int row)
{
    for (int i = 0; i < row; ++i)
        delete [] matrix[i];
    delete [] matrix;
}
 
void fill_matrix_rand(int ** matrix, int row, int col)
{
    Sleep(800);
    srand(time(0));
    for (int i = 0; i < row; ++i)
        for (int j = 0; j < col; ++j)
            matrix[i][j] = 10 + rand()%89;
}
 
int ** multiply_matrices(int ** matrix1, int ** matrix2, int row, int col)
{
    int ** result = create_matrix(row, col);
    for (int i = 0; i < row; ++i)
        for (int j = 0; j < col; ++j)
            result[i][j] = matrix1[i][j] * matrix2[i][j];
    return result;
}
 
void show_matrix(int ** matrix, int row, int col)
{
    for (int i = 0; i < row; ++i)
    {
        for (int j = 0; j < col; ++j)
            std::cout << matrix[i][j] << "\t";
        std::cout << "\n";
    }
    std::cout << "\n";
}
 
int main()
{
    int row;
    std::cout << "Please enter the number of the rows: ";
    std::cin >> row;
 
    int col;
    std::cout << "Please enter the number of the columns: ";
    std::cin >> col;
 
    int ** matrix1 = create_matrix(row, col);
    fill_matrix_rand(matrix1, row, col);
    show_matrix(matrix1, row, col);
    
    int ** matrix2 = create_matrix(row, col);
    fill_matrix_rand(matrix2, row, col);
    show_matrix(matrix2, row, col);
 
    int ** result_matrix = multiply_matrices(matrix1, matrix2, row, col);
    show_matrix(result_matrix, row, col);
 
    delete_matrix(matrix1, row);
    delete_matrix(matrix2, row);
    delete_matrix(result_matrix, row);
 
    return 0;
}
Правда, размер у всех матриц одинаковый. Если надо разный, то надо будет маленько код переделать, а мне лениво.
tezaurismosis
Супер-модератор
 Аватар для tezaurismosis
6331 / 2959 / 465
Регистрация: 17.04.2012
Сообщений: 7,380
Записей в блоге: 14
Завершенные тесты: 4
10.10.2015, 09:00     Перемножение двух матриц #6
Как-то с Михаилом (KOPOJI) писали в качестве развлечения, в сишном стиле, правда.
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 <stdio.h>
#include <stdlib.h>
 
// Все методы, связанные с матрицами, начинаю с mx_
 
struct _matrix_type
{
    size_t rows;
    size_t columns;
    int** data;
};
 
// АТЕНСЬОН! Не создавайте матрицу простым инстанцированием
// этой структуры или сами выделяйте под неё память.
// Используйте mx_allocate(), ибо нефиг.
typedef struct _matrix_type mx_t;
 
/**
 * Создаёт новую матрицу заданного размера,
 * выделяя под неё память.
 */
mx_t mx_allocate(size_t rows, size_t columns) {
    // выделяем память под строки
    // берём размер *указателя* на int
    int** matrix = (int**)malloc(sizeof(int*) * rows);
    for (int row = 0; row < rows; row++) {
        // выделяем память внутри строк (ячейки)
        matrix[row] = (int*)malloc(sizeof(int) * columns);
    }
    
    mx_t result = {
        .rows = rows,
        .columns = columns,
        .data = matrix
    };
    
    return result;
}
 
/**
 * Заполняет матрицу случайными числами от 0 до 99.
 */
void mx_random_fill(mx_t mx) {
    for (int r = 0; r < mx.rows; r++) {
        for (int c = 0; c < mx.columns; c++) {
            mx.data[r][c] = rand() % 100;
        }
    }
}
 
/**
 * Выводит матрицу в стандартный поток вывода.
 */
void mx_print(mx_t mx) {
    for (int r = 0; r < mx.rows; r++) {
        for (int c = 0; c < mx.columns; c++) {
            printf("%d ", mx.data[r][c]);
        }
        printf("\n");
    }
}
 
/**
 * Перемножает матрицы за O(n^3).
 */
mx_t mx_multiply(mx_t left, mx_t right) {
    // TODO: Проверка размеров матриц
    mx_t result = mx_allocate(left.rows, right.columns);
    for (int r = 0; r < left.rows; r++) {
        for (int c = 0; c < right.columns; c++) {
            for (int n = 0; n < left.columns; n++) {
                result.data[r][c] += left.data[r][n] * right.data[n][c];
            }
        }
    }
    
    return result;
}
 
/**
 * Освобождает память, отведённую под матрицу.
 */
void mx_free(mx_t matrix) {
    free(matrix.data);
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.10.2015, 11:11     Перемножение двух матриц
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Байт
 Аватар для Байт
14011 / 8842 / 1235
Регистрация: 24.12.2010
Сообщений: 16,023
10.10.2015, 11:11     Перемножение двух матриц #7
Johny Deagle, Пусть матрицы L x N и N x M (только такие можно перемножать)
Тогда твои строки 11-13 будут выглядеть так
C++
1
2
3
 a = new double[L*N];
 b = new double[N*M];
 c = new double[L*M];
Ну и все остальное надо подправить очевидным образом

Добавлено через 4 минуты
Johny Deagle, Видимо, твоя ошибка в том, что ты пытаешься умножать матрицы любых размеров. Однако Алгебра этого не умеет. Количество столбцов первой должно быть = количеству строк второй. Вот тогда и умножай.
Yandex
Объявления
10.10.2015, 11:11     Перемножение двух матриц
Ответ Создать тему
Опции темы

Текущее время: 17:48. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru