Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
125 / 117 / 67
Регистрация: 07.11.2014
Сообщений: 788

Исправить программу для умножения матриц

02.12.2015, 12:30. Показов 957. Ответов 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
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
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
    //   a  , b  ,  c , d
    int raz1,raz2,dva1,dva2;
    int i,j,k;
    cout<<"Vvedite [x][y] pervoi matricy:"; cin>>raz1>>raz2;
    cout<<"Vvedite [x][y] vtoroy matricy:"; cin>>dva1>>dva2;
    int **matrix1 = new int*[raz1*2];   
    for(i=1; i<=raz1;i++) 
    { 
    matrix1[i]=new int[raz2*2]; 
    } 
    
    int **matrix2 = new int*[dva1*2]; 
    for(i=1; i<=dva1;i++) 
    { 
    matrix2[i]=new int[dva2*2]; 
    }
    
    int *rowFactor = new int[dva2*2];
    int *columnFactor = new int[dva2*2];
 
    int **R = new int*[raz1];
    for (i=1; i<=dva1; i++)
    {
        R[i]=new int[dva1];
    }
    //Заполняем первый массив
    for (i=1; i<=raz1; i++)
    {
    for (j=1; j<=raz2; j++)
    {
        cout<<"Matrix1["<<i<<"]["<<j<<"]="; cin>>matrix1[i][j];
    }
    }
    //Заполняем второй массив
    for (i=1; i<=dva1; i++)
    {
    for (j=1; j<=dva2; j++)
    {
        cout<<"Matrix2["<<i<<"]["<<j<<"]="; cin>>matrix2[i][j];
    }
    }
    /*
    Используем метод Виноград
    Мы знаем что, после нахождения произведения матриц - выходная матрица будет увеличена.
    Значит нам нужна матрица побольше. 
    */
    //dva2=raz2/2;
    for (i = 1; i<=raz1; i++){
    rowFactor[i] = matrix1[i][1]*matrix1[i][2];
    for (j = 1; j<=dva2; j++){
    rowFactor[i] = rowFactor[i] + matrix1[i][2*j-1] * matrix1[i][2*j];
    }}
    for (i=1; i<=dva1; i++)
    {
    columnFactor[i]=matrix2[1][i] * matrix2[2][i];
    for (j=1; j<=dva2; j++)
    {
    columnFactor[i]=columnFactor[i]+matrix2[2*i-1][i]*matrix2[2*j][i];
    }
    }
    for (i=1; i<=raz1; i++)
    {
        for (j=1; j<=dva1; j++)
        {
        R[i][j]=-rowFactor[i]-columnFactor[j];
            for (k=1; k<=dva2; k++)
            {
                R[i][j]=R[i][j]+(matrix1[i][2*k-1]+matrix2[2*k][j])*(matrix1[i][2*k]+matrix2[2*k-1][j]);
            }
        }
    }
    if (2*(raz2/2)==2*(raz2/2)/raz2) { 
    for (i=1; i<=raz1; i++)
    {
        for (j=1; j<=dva1; j++)
        {
            R[i][j]=R[i][j]+matrix1[i][raz2]*matrix2[raz2][j];
        }
    }
    }
    for (i=1; i<=raz1; i++)
    {
        for (j=1; j<=dva1; j++)
        {
            cout<<R[i][j]<<" ";
        } // вот вывод ^^^
    }
}
Проблема в том, что вылетает при выводе результата... Пробовал увеличить размер массива вдвое, думал из-за этого, оказалось нет так. Как исправить? З.Ы., массивы индексируются у меня с 1, за то i<=raz1, т.е. массив может быть равен 5, если raz1=5; Так что все нормально, ибо 1,2,3,4,5 - 5 чисел, все то же самое что и с 0,1,2,3,4(5 не пишем потому что в таком случае я бы поставил i<raz1, т.е. i!=raz1)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.12.2015, 12:30
Ответы с готовыми решениями:

Прокомментировать код - алгоритм Штрассена для умножения матриц
Народ Здравствуйте , есть такая задача ( Курсовая работа, алгоритм Штрассена для умножения матриц ) Пожалуйста сделайте в коде...

Ввести класс для работы с прямоугольной матрицей, реализовать операции сложения и умножения матриц
Кто-нибудь подскажите, пожалуйста написать программу в С++. Ввести класс для работы с прямоугольной матрицей. Реализовать операции: ...

Составить программу для умножения и сложения матриц.
В программе предусмотреть вывод исходных матриц и матрицы - результата. | 5 3 -1 | | 1 4 16 | A= | 2 ...

16
249 / 219 / 63
Регистрация: 30.07.2013
Сообщений: 465
02.12.2015, 12:34
Цитата Сообщение от Aymurat Посмотреть сообщение
Так что все нормально
Не нормально, т.к. максимальный валидный индекс в массиве - 4, а ты у него 5-й просишь.
0
125 / 117 / 67
Регистрация: 07.11.2014
Сообщений: 788
02.12.2015, 12:37  [ТС]
Цитата Сообщение от Fyret Посмотреть сообщение
Не нормально, т.к. максимальный валидный индекс в массиве - 4, а ты у него 5-й просишь.
Я же в два раза увеличил размер массива, таких ошибок быть не должно... Или я не вижу.. Где именно?
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
02.12.2015, 12:49
Цитата Сообщение от Aymurat Посмотреть сообщение
Я же в два раза увеличил размер массива
например, вот тут не увеличил:
C++
26
    int **R = new int*[raz1];
а дальше там для прохода используем другую переменную:
C++
27
28
29
30
    for (i=1; i<=dva1; i++)
    {
        R[i]=new int[dva1];
    }
Ну и вся эта идея не нормальна сама по себе.
1
125 / 117 / 67
Регистрация: 07.11.2014
Сообщений: 788
02.12.2015, 12:52  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
а дальше там для прохода используем другую переменную:
В выводе я использую сразу 2 переменных raz1, dva1; Они и были объявлены... Это же двумерный массив. Увеличил там где Вы показали, спасибо... Пробовал скомпилировать, снова вылетает..
0
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,244
02.12.2015, 13:09
Aymurat, А Вы понимаете, что первый индекс массива равен нулю, а последний на 1 меньше размера (не raz1, а raz1-1 и т.д.)?
1
125 / 117 / 67
Регистрация: 07.11.2014
Сообщений: 788
02.12.2015, 13:19  [ТС]
/del

Угу. Понимаю, но если поставить на ноль - вся конструкция будет разрушена, и я же не запрашиваю первый элемент(massiv[0])... Просто остается одна клетка пустая.
0
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,244
02.12.2015, 13:22
Aymurat, но Вы ведь используете несуществующий элемент raz1.
Делайте тогда все массивы на 1 большими!
0
125 / 117 / 67
Регистрация: 07.11.2014
Сообщений: 788
02.12.2015, 13:33  [ТС]
Цитата Сообщение от zss Посмотреть сообщение
но Вы ведь используете несуществующий элемент raz1.
Почему несуществующий элемент? Я его объявил, заполнил
C++
1
2
  cout<<"Vvedite [x][y] pervoi matricy:"; cin>>raz1>>raz2;
    cout<<"Vvedite [x][y] vtoroy matricy:"; cin>>dva1>>dva2;
Если бы я начинал массив с нуля, цикл был бы такой:
C++
1
 for(i=0; i<dva1;i++){}
Т.е. , если dva1=5;[0;5); (5 не входит) 0,1,2,3,4 - 5 элементов
Начинаю с 1:
C++
1
 for(i=1; i<=dva1;i++){}
dva1=5; [1;5]; (5 входит) 1,2,3,4,5 - 5 элементов. Аналогично же?
0
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,244
02.12.2015, 13:52
Цитата Сообщение от Aymurat Посмотреть сообщение
i<=dva1
что адресует R[i] при i=dva1?
R[dva1] НЕ СУЩЕСТВУЕТ!
1
125 / 117 / 67
Регистрация: 07.11.2014
Сообщений: 788
02.12.2015, 17:42  [ТС]
Т.е., если n=5; i=1; i<=n; здесь будет только 4 элементов массива?

Добавлено через 2 часа 15 минут
Цитата Сообщение от zss Посмотреть сообщение
что адресует R[i] при i=dva1?
R[dva1] НЕ СУЩЕСТВУЕТ!
Как раз таки адресует! Самый последний элемент массива...
0
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,244
02.12.2015, 19:04
n=5, есть элементы R[0],R[1],R[2],R[3],R[4]
а R[5] НЕТУ!
0
125 / 117 / 67
Регистрация: 07.11.2014
Сообщений: 788
02.12.2015, 19:48  [ТС]
Цитата Сообщение от zss Посмотреть сообщение
n=5, есть элементы R[0],R[1],R[2],R[3],R[4]
а R[5] НЕТУ!
Мы же начинаем не с 0!!! А с 1!!! Значит R[1],R[2],R[3],R[4],R[5]; ведь 5 ВХОДИТ в интервал
Ибо i<=n;
0
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,244
02.12.2015, 20:08
Какая разница, с чего Вы начинаете! Вы просто 0 элемент не используете.
Идея адресации следующая
C++
1
2
3
4
5
6
int x[5];
int *p=x; // p получает адрес начала массива
*(p+0)=1; /*или*/ p[0]=1; // первый элемент
*(p+1)=2; /*или*/ p[1]=2; // второй элемент
...
*(p+4)=5; /*или*/ p[4]=5; // последний элемент
0
125 / 117 / 67
Регистрация: 07.11.2014
Сообщений: 788
02.12.2015, 20:19  [ТС]
Цитата Сообщение от zss Посмотреть сообщение
Какая разница, с чего Вы начинаете! Вы просто 0 элемент не используете.
Идея адресации следующая
И что? Зачем Вы мне это говорите? Это, по-моему, никак не связано. Я начал с 1 закончил с 5, у меня 5 элементов, все что нужно есть. 0 элемент просто остается пустым))
0
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,244
02.12.2015, 20:20
5 элементов + 1 пустой - итого ШЕСТЬ.
А память выделена под ПЯТЬ!
Цитата Сообщение от Aymurat Посмотреть сообщение
R[i]=new int[dva1];
0
125 / 117 / 67
Регистрация: 07.11.2014
Сообщений: 788
03.12.2015, 15:17  [ТС]
Цитата Сообщение от Aymurat Посмотреть сообщение
Я же в два раза увеличил размер массива, таких ошибок быть не должно... Или я не вижу.. Где именно?
Цитата Сообщение от Croessmah Посмотреть сообщение
например, вот тут не увеличил:
C++
1
 int **R = new int*[raz1];
Цитата Сообщение от Aymurat Посмотреть сообщение
Увеличил там где Вы показали, спасибо...
Я там в два раза больше памяти выделил))

Добавлено через 14 часов 37 минут
UPD

Добавлено через 3 часа 59 минут
Вот, чтобы было удобнее рассмотреть:
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
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
    //   a  , b  ,  c , d
    int raz1,raz2,dva1,dva2;
    int i,j,k;
    cout<<"Vvedite [x][y] pervoi matricy:"; cin>>raz1>>raz2;
    cout<<"Vvedite [x][y] vtoroy matricy:"; cin>>dva1>>dva2;
    int **matrix1 = new int*[raz1*2];   
    for(i=1; i<=raz1;i++) 
    { 
    matrix1[i]=new int[raz2*2]; 
    } 
    
    int **matrix2 = new int*[dva1*2]; 
    for(i=1; i<=dva1;i++) 
    { 
    matrix2[i]=new int[dva2*2]; 
    }
    
    int *rowFactor = new int[dva2*2];
    int *columnFactor = new int[dva2*2];
 
    int **R = new int*[raz1*2];
    for (i=1; i<=dva1; i++)
    {
        R[i]=new int[dva1*2];
    }
    //Заполняем первый массив
    for (i=1; i<=raz1; i++)
    {
    for (j=1; j<=raz2; j++)
    {
        cout<<"Matrix1["<<i<<"]["<<j<<"]="; cin>>matrix1[i][j];
    }
    }
    //Заполняем второй массив
    for (i=1; i<=dva1; i++)
    {
    for (j=1; j<=dva2; j++)
    {
        cout<<"Matrix2["<<i<<"]["<<j<<"]="; cin>>matrix2[i][j];
    }
    }
    /*
    Используем метод Виноград
    Мы знаем что, после нахождения произведения матриц - выходная матрица будет увеличена.
    Значит нам нужна матрица побольше. 
    */
    //dva2=raz2/2;
    for (i = 1; i<=raz1; i++){
    rowFactor[i] = matrix1[i][1]*matrix1[i][2];
    for (j = 1; j<=dva2; j++){
    rowFactor[i] = rowFactor[i] + matrix1[i][2*j-1] * matrix1[i][2*j];
    }}
    for (i=1; i<=dva1; i++)
    {
    columnFactor[i]=matrix2[1][i] * matrix2[2][i];
    for (j=1; j<=dva2; j++)
    {
    columnFactor[i]=columnFactor[i]+matrix2[2*i-1][i]*matrix2[2*j][i];
    }
    }
    for (i=1; i<=raz1; i++)
    {
        for (j=1; j<=dva1; j++)
        {
        R[i][j]=-rowFactor[i]-columnFactor[j];
            for (k=1; k<=dva2; k++)
            {
                R[i][j]=R[i][j]+(matrix1[i][2*k-1]+matrix2[2*k][j])*(matrix1[i][2*k]+matrix2[2*k-1][j]);
            }
        }
    }
    if (2*(raz2/2)==2*(raz2/2)/raz2) { 
    for (i=1; i<=raz1; i++)
    {
        for (j=1; j<=dva1; j++)
        {
            R[i][j]=R[i][j]+matrix1[i][raz2]*matrix2[raz2][j];
        }
    }
    }
    for (i=1; i<=raz1; i++)
    {
        for (j=1; j<=dva1; j++)
        {
            cout<<R[i][j]<<" ";
        }
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.12.2015, 15:17
Помогаю со студенческими работами здесь

Написать программу для умножения матриц, нахождения определителя
написать программу для умножения матриц, нахождения определителя и т.д. написать функции На рисунке показан пример.

Написать процедуру для сложения, умножения квадратных матриц N*N, и умножения матрицы на вектор
Написать процедуру для сложения, умножения квадратных матриц N*N, и умножения матрицы на вектор

Составить программу умножения матриц.
Составить подпрограмму умножения матриц и подпрограмму их сравнения.Помогите написать программу)

Cоставить программу умножения двух матриц
пожалуйста,помогите решить задачи!буду очень благодарна. 1) составить программу вычисления ряда S=1+1\2+1\3+... вычисление закончить,как...

Напишите программу ввода, сложения и умножения двух матриц
Напишите программу ввода, сложения и умножения двух матриц


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru