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

Умножение матриц

31.07.2011, 13:07. Показов 7293. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте,пишу программу ,которая выполняет действия над матрицами
вот код
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
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int N,i,j,k;
Matrix A, B, C,D;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
void __fastcall TForm1::GetMatrix(Matrix A, Matrix B)
 {
 for( i= 1; i<=N; i++)
 for( j= 1; j<=N; j++)
 A[i][j]= StrToFloat(Matrix_A->Cells[j-1][i-1]);
for( i= 1; i<=N; i++)
for( j= 1; j<=N; j++)
B[i][j]= StrToFloat(Matrix_B->Cells[j-1][i-1]);
 }
 void __fastcall TForm1::GetMatrixA(Matrix A)
 {
 for( i= 1; i<=N; i++)
 for( j= 1; j<=N; j++)
 A[i][j]= StrToFloat(Matrix_A->Cells[j-1][i-1]);
 }
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
N=StrToInt(Edit1->Text);
Matrix_A->RowCount= N;
Matrix_A->ColCount= N;
Matrix_B->RowCount= N;
Matrix_B->ColCount= N;
Matrix_C->RowCount= N;
Matrix_C->ColCount= N;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
 GetMatrix(A, B);
 for( i= 1; i<=N; i++)
  for( j= 1; j<=N; j++)
  C[i][j]= A[i][j]+B[i][j];
  for( i= 1; i<=N; i++)
  for( j= 1; j<=N; j++)
  Matrix_C->Cells[j-1][i-1]= FloatToStr(C[i][j]);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
GetMatrix(A, B);
 for( i= 1; i<=N; i++)
  for( j= 1; j<=N; j++)
  C[i][j]= A[i][j]-B[i][j];
  for( i= 1; i<=N; i++)
  for( j= 1; j<=N; j++)
  Matrix_C->Cells[j-1][i-1]= FloatToStr(C[i][j]);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
for( k= 1; k<=N; k++)
for( i= 1; i<=N; i++)
D[k][i]= 0;
GetMatrix(A, B);
for( k= 1; k<=N; k++)
 for( i= 1; i<=N; i++)
  { 
  for( j= 1; j<=N; j++)
  D[k][i]= D[k][i]+A[k][j]*B[j][i];
   } 
  for( i= 1; i<=N; i++)
  for( j= 1; j<=N; j++)
  Matrix_C->Cells[j-1][i-1]= FloatToStr(D[i][j]);
}
проблема в умножении матриц!большинство примеров программа считает правильно,но вот ,например,
1 2
43
на
-0,6 0,4
0,8 -0,2
она выдает неправильный ответ в чем может быть дело???
кнопка 4 отвечает за умножение
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.07.2011, 13:07
Ответы с готовыми решениями:

Умножение матриц
помогите найти ошибку //--------------------------------------------------------------------------- #include &lt;vcl.h&gt; #pragma...

Умножение неквадратных матриц
Проблема только в том, что квадратные матрицы умножает неправильно, а с не квадратными вообще что-тоне то делает. до умножения всё делает...

Умножение матриц в С++ Rad XE3
Вроде бы простая и неоднократно просматриваемая тема, но при реализации в билдере на стрингридах появляються непонятные ошибки. Помогите...

13
1090 / 588 / 121
Регистрация: 11.11.2008
Сообщений: 1,544
01.08.2011, 05:44
прикрепи проект целиком
0
 Аватар для xAtom
935 / 760 / 299
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
01.08.2011, 06:51
вот накидал, для наглядности умножение квадратных матриц порядка N, по твоей задаче.
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
void __fastcall TForm1::Button1Click(TObject *Sender) {
 
   const int N  = 4;
   int mxa[N][N] = {
        { 10, 20, 50, -7 },
        { 32, 19, 40, 45 },
        { 11, 22, 50, -7 },
        { 32, 49, 10, 25 }
   };
   int mxb[N][N] = {
        { 1, 2, 5, 7 },
        { 3, 1, 4, 5 },
        { 1, 2, 5, 7 },
        { 3, 4, 1, 2 }
   };
   int mxc[N][N];
 
   int r, c, c1;
   for(r = 0; r < N; r++)
       memset(mxc[r], 0, sizeof(int) * N);
 
   // вот сам процесс умножение видишь всего 6-строчек
   for(r = 0; r < N; r++) {
        for(c = 0; c < N; c++) {
            for(c1 = 0; c1 < N; c1++)
                mxc[r][c] += mxa[r][c1] * mxb[c1][c];
        }
   }
 
   // покажем результат на форме
   for(r = 0; r < N; r++) {
     for(c = 0; c < N; c++)
         Canvas->TextOutA(100 + c * 50, 100 + r * 50, IntToStr(mxc[r][c]));
   }
}
1
0 / 0 / 0
Регистрация: 05.07.2011
Сообщений: 26
01.08.2011, 17:21  [ТС]
все,проблема решена
0
0 / 0 / 0
Регистрация: 14.03.2018
Сообщений: 120
30.04.2020, 15:51
Здравствуйте! Подскажите пожалуйста, как реализовать в с++ builder умножение матриц при помощи компонента StringGrid?
Буду очень признателен за помощь и код так как в и-нете много информации, но только для консолей а мне нужно в StringGrid
Заранее спасибо
0
Модератор
 Аватар для D1973
9920 / 6456 / 2456
Регистрация: 21.01.2014
Сообщений: 27,398
Записей в блоге: 3
30.04.2020, 15:54
uzer_srm34, работайте с массивами по консольному алгоритму. А СтрингГрид используйте только для ввода/вывода данных, но уж никак не для операций с ними.
0
0 / 0 / 0
Регистрация: 14.03.2018
Сообщений: 120
30.04.2020, 16:10
Хорошо, спасибо попробую, если что можно Вам написать на почту? Или как?
0
Модератор
 Аватар для D1973
9920 / 6456 / 2456
Регистрация: 21.01.2014
Сообщений: 27,398
Записей в блоге: 3
30.04.2020, 16:16
Цитата Сообщение от uzer_srm34 Посмотреть сообщение
Или как?
только в теме. См. п. 4.6 Правил форума
0
0 / 0 / 0
Регистрация: 14.03.2018
Сообщений: 120
01.05.2020, 11:55
Здравствуйте! Подскажите пожалуйста как правильно здесь реализовать, у меня два варианта кода, для произведение матриц первый он динамический так как мне нужно n x m сделать, а второй статический да и то только 3х3, просто у меня ни как не получается сделать n x m, работаю в среде с++ builder а данные ввожу в две таблицы StringGrid, а вывожу в 3-й StringGrid.
Буду очень благодарен Вам за помощь, так как времени у меня мало осталось.

Первый код:

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
void __fastcall TForm6::Button3Click(TObject *Sender)
{
  int row1, row2, col1, col2;
  int **a, **b, **c;
 
  row1 = StrToInt(Edit1->Text);
  col1 = StrToInt(Edit2->Text);
 
  row2 = StrToInt(Edit3->Text);
  col2 = StrToInt(Edit4->Text);
 
  if(col1 != row2)
  {
    ShowMessage("Множення матриць не можливе \n Оскільки кількість \n стовпців матриці А не дорівнює кількості рядків матриці В");
  }
  // Ввід елементів першої матриці
  a = new int*[row1];
  for(int i = 0; i < row1; i++)
  {
   a[i] = new int[col1];
   for(int j = 0; j < col1; j++)
   {
    a[i][j];
   }
  }
 
  // Ввід елементів другої матриці
  b = new int*[row2];
  for(int i = 0; i < row2; i++)
  {
    b[i] = new int[col2];
    for(int j = 0; j < col2; j++)
    {
     b[i][j];
    }
  }
 
  // Множення матриць
  c = new int*[row1];
  for(int i = 0; i < row1; i++)
  {
   c[i] = new int[col2];
   for(int j = 0; j < col2; j++)
   {
     c[i][j] = 0;
     for(int k = 0; k < col1; k++)
     {
      c[i][j] += a[i][k] * b[k][j];
     }
   }
  }
 
  // Вивід добутку матриць
  for(int i = 0; i < row1; i++)
  {
   for(int j = 0; j < col2; j++)
   {
    SG3->Cells[i][j] = c[i][j];
   }
  }
 
 
}

----------------------------------------------------------------------------

Второй код (статический):

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void multiply(int u[3][3], int v[3][3],int w[3][3])
{ const int n = 3;  int i, j, k;
for(i = 0; i < n; i++)
for(j = 0; j < n; j++)
{ w[i][j] = 0;
  for(k = 0; k < n; k++) w[i][j] += u[i][k] * v[k][j];}    }
 
 
void __fastcall TForm6::Button3Click(TObject *Sender)
{ int i, j, a[3][3], b[3][3], c[3][3];
for(i = 0; i < 3; i++)
for(j = 0; j < 3; j++)
{ a[i][j] = StrToInt(SG1->Cells[j][i]);b[i][j] = StrToInt(SG2->Cells[j][i]);
}
multiply(a, b, c);
for(i = 0; i < 3; i++)
for(j = 0; j < 3; j++)
SG3->Cells[j][i] = IntToStr(c[i][j]);
}
Добавлено через 1 минуту
При динамическом подсчете оно выводит в SG3 очень много цифр, которые никак не могли получится там
0
Модератор
 Аватар для D1973
9920 / 6456 / 2456
Регистрация: 21.01.2014
Сообщений: 27,398
Записей в блоге: 3
02.05.2020, 13:17
Цитата Сообщение от uzer_srm34 Посмотреть сообщение
for(int j = 0; j < col1; j++)
   {
    a[i][j];
   }
uzer_srm34, а Вы можете объяснить, что бы Вот это значило?
Цитата Сообщение от uzer_srm34 Посмотреть сообщение
которые никак не могли получится там
Массивы А и В вообще не инициализированы: там мусор в них вместо значений... А мусор * мусор = мусор2, что Вы и получаете в массиве С...
0
0 / 0 / 0
Регистрация: 14.03.2018
Сообщений: 120
02.05.2020, 13:31
А подскажите пожалуйста как тогда правильно записать это?
там где a[i][j] я хотел инициализировать его в SG1->Cells[i][j];

Буду признателен Вам за объяснение и помощь
0
Модератор
 Аватар для D1973
9920 / 6456 / 2456
Регистрация: 21.01.2014
Сообщений: 27,398
Записей в блоге: 3
02.05.2020, 14:16
uzer_srm34, посмотрите, как это записано в "Вашем" коде, который 3х3...
0
0 / 0 / 0
Регистрация: 14.03.2018
Сообщений: 120
02.05.2020, 16:51
Большое спасибо Вам!!! Разобрался, работает Простите за глупые вопросы.
0
0 / 0 / 0
Регистрация: 14.03.2018
Сообщений: 120
04.05.2020, 17:48
Здравствуйте, подскажите пожалуйста как тут сделать: Я пишу программку на с++ builder которая должна подносить матрицу в любую степень, я на форме разместил два StringGrid В одном записывается исходная матрица, во втором уже будет результат поднесения в степень, а для самой степени использую поле ввода Edit, я думал сделать циклом что-то вроде этого

C++
1
2
3
4
5
6
7
n = StrToInt(Edit1->Text); // Ввод степени матрицы 
 
for(int i  = 1; i < n; i++)
{
.................
 
}
и далее код который будет подносить матрицу в степень, но что-то не получается у меня, она не реагирует на мой цикл, но очень хорошо подносит в квадрат.
Буду очень благодарен Вам за помощь.

Вот мой код:

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
void __fastcall TForm7::Button1Click(TObject *Sender)
{
 int row1, col1, n;
  int **a,  **c                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ;
 
  row1 = StrToInt(Edit2->Text);
  col1 = StrToInt(Edit3->Text);
 
  n = StrToInt(Edit1->Text);
 
 
 
    // Ввід елементів першої матриці
     a = new int*[row1];
     for(int i = 0; i < row1; i++)
      {
        a[i] = new int[col1];
        for(int j = 0; j < col1; j++)
         {
           a[i][j] = StrToInt(SG1->Cells[j][i]);
          }
        }
 
      // Множення матриць
     for(int l = 1; l < n; l++)
     {
      c = new int*[row1];
      for(int i = 0; i < row1; i++)
       {
         c[i] = new int[col1];
         for(int j = 0; j < col1; j++)
          {
            c[i][j] = 0;
            for(int k = 0; k < col1; k++)
             {
               c[i][j] += a[i][k] * a[k][j];
 
 
             }
            }
         }
 
        // Вивід добутку матриць
        for(int i = 0; i < row1; i++)
         {
            for(int j = 0; j < col1; j++)
             {
               SG2->Cells[j][i] = c[i][j];
              }
         }
 
  }
  }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.05.2020, 17:48
Помогаю со студенческими работами здесь

Умножение матриц: исходная на обращённую
void __fastcall TForm1::Button4Click(TObject *Sender) { int i,j,k,n,m; double SG1,SG2,SG3; n=StrToFloat(LabeledEdit1-&gt;Text); ...

Умножение НЕквадратных матриц (не работает код)
1) делал умножение матриц, где число строк и столбцов одинаковое кол-во, работает, но только с целыми числами , но работает, считает...

Перемножение матриц, умножение матриц на вектор, сложение матриц
Помогите пожалуйста написать программу, которая производит основные действия с матрицами произвольных размеров (перемножения 2х матриц,...

Умножение матриц с интерфейсом и возможность заполнения исходных матриц из файла
Здравствуйте. Я сделал программу, которая умножает матрицы с интерфейсом, только проблема в том что необходимо заполнять сами матрицы...

Транспонирование, умножение матриц, сложение матриц Реализовать в одной программере
транспонирование, умножение матриц, сложение матриц; B^3-A^T Реализовать в одной программере. Помогите решить


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера 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