0 / 0 / 0
Регистрация: 31.12.2010
Сообщений: 21
1

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

30.03.2011, 21:02. Показов 10940. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не знаю как написать код с циклом так, чтобы 2 матрицы перемножались. Кто нибудь знает как это сделать? Я написал банальный код как по формуле, но не знаю как бы сократить число строк при помощи циклов.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.03.2011, 21:02
Ответы с готовыми решениями:

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

Перемножение матриц
Помогите пожалуйста с перемножение матриц m1 на m1, результирующая матрица res. Размеры матриц :...

Перемножение трехмерных матриц
помогите написать код по программированию в делфи. Даны две матрицы размером 3 на 3. найти их...

Перемножение квадратичных матриц
есть две матрицы со значениями: 1)x4,x3,x2 x3,x2,x x2,x,10 2)1,0,0 ...

11
12 / 11 / 3
Регистрация: 12.10.2010
Сообщений: 268
30.03.2011, 21:16 2
Перемножение матрицы саму на себя :
Delphi
1
2
3
4
5
6
for i:=0 to stringgrid1.colcount-1 do
 for j:=0 to stringgrid1.colcount-1 do begin
 s:=0;
 for k:=0 to stringgrid1.colcount-1 do
s:=(s+ a[k,i]*b[j,k]);
stringgrid1.Cells[j,i]:=inttostr(s);
Только подкорректируй для своего решения .
1
85 / 69 / 12
Регистрация: 17.02.2011
Сообщений: 138
30.03.2011, 21:43 3
Ну можно так попробовать, если a имеет размерность m*k, b имеет размерность k*n то элементы матрицы с. равной их произведению, можно определить так
Delphi
1
2
3
4
5
6
7
for i:=0 to m-1 do
  for j:=0 to n-1 do
   begin
     c[i,j]:=0;
     for l:=0 to k-1 do
       c[i,j]:=c[i,j]+a[i,l]*b[l,j];
   end;
0
0 / 0 / 0
Регистрация: 31.12.2010
Сообщений: 21
31.03.2011, 18:02  [ТС] 4
Добавлено через 17 секунд
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
procedure TForm1.BitBtn4Click(Sender: TObject);
var i,j,l:integer;
c,a,b:array [0..4,0..4] of integer;
begin
//with stringgrid4 do
  for i:=0 to StringGrid4.ColCount-1 do
  for j:=0 to StringGrid5.RowCount-1 do
    begin
       for l:=0 to StringGrid5.ColCount-1 do
        a[i,l]:=strtoint(StringGrid4.cells[i,j]);
        b[l,j]:=strtoint(StringGrid5.cells[i,j]);
        c[i,j]:=c[i,j] + a[i,l] * b[l,j];
       c[i,j]:=inttostr(StringGrid6.cells[i,j]);
end;
end;
procedu
Почему не перемножает матрицы, я наверное что-то не то написал...
0
85 / 69 / 12
Регистрация: 17.02.2011
Сообщений: 138
31.03.2011, 18:44 5
Да, есть ошибка. Разведите отдельно чтение матриц из грида и перемножение. Просто при перемножении процедура запрашивает те переменные, значение которых еще не получено из Стрингрид. Ну если желаете, что можно так.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
procedure TForm1.BitBtn4Click(Sender: TObject);
var i,j,l:integer;
c,a,b:array [0..4,0..4] of integer;
begin
 
  for i:=0 to StringGrid4.ColCount-1 do
    for j:=0 to StringGrid4.RowCount-1 do
      a[j,i]:=strtoint(StringGrid4.cells[i,j]);
  for i:=0 to StringGrid5.ColCount-1 do
    for j:=0 to StringGrid5.RowCount-1 do
      b[j,i]:=strtoint(StringGrid5.cells[i,j]);
  for i:=0 to 4 do
    for j:=0 to 4 do
    begin
       c[i,j]:=0;
      for l:=0 to 4 do        
        c[i,j]:=c[i,j] + a[i,l] * b[l,j];    
      StringGrid6.cells[j,i]:=inttostr(c[i,j]);//возможно ошибку выдавало именно строчка, соответствующая в вашей программе этой?
    end;
end;
Еще, количество строк и столбцов в гриде соответствует размерности массивов?

Можно еще и так

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
procedure TForm1.BitBtn4Click(Sender: TObject);
var i,j,l:integer;
c,a,b:array [0..4,0..4] of integer;
begin
 
  for i:=0 to 4 do
    for j:=0 to 4 do
     begin
      a[i,j]:=strtoint(StringGrid4.cells[j,i]);
      b[i,j]:=strtoint(StringGrid5.cells[j,i]);
     end;      
  for i:=0 to 4 do
    for j:=0 to 4 do
    begin
       c[i,j]:=0;
      for l:=0 to 4 do        
        c[i,j]:=c[i,j] + a[i,l] * b[l,j];    
      StringGrid6.cells[j,i]:=inttostr(c[i,j]);
    end;
end;
0
0 / 0 / 0
Регистрация: 31.12.2010
Сообщений: 21
01.04.2011, 06:04  [ТС] 6
Сижу думаю...Первый вариант верен, он хотя бы вводит ответ в матрицу, а вот второй пример, не вводит в матрицу и выдаёт ошибку - "Project Project1.exe raised exception class EConvert Error with message ''' is not a valid integer value'. Process stopped. Use step or run to continue"(такая ошибка у меня тоже в моём примере).
0
85 / 69 / 12
Регистрация: 17.02.2011
Сообщений: 138
01.04.2011, 06:21 7
Расскажите какова размерность таблиц в вашем примере, выложите весь код и укажите в какой строке кода компилятор указывает на ошибку.
0
0 / 0 / 0
Регистрация: 31.12.2010
Сообщений: 21
01.04.2011, 08:31  [ТС] 8
размер таблиц к моём примере: a[3,3] and b[2,3];
Я вписал в array от 0 до 4, а надо было до 2. Теперь показывает то что надо, но иногда в таблце со столбцом c[3] выдаёт числа 4-х значные, но после нажатия 2-3-х раз, всё приходит в норму, потом итерация идёт.
0
Почетный модератор
64291 / 47589 / 32740
Регистрация: 18.05.2008
Сообщений: 115,181
01.04.2011, 08:48 9
Цитата Сообщение от Laughing man Посмотреть сообщение
размер таблиц к моём примере: a[3,3] and b[2,3];
Вам разве не говорили что число столбцов первой матрицы должно быть равно числу строк второй матрицы? Т.е. умножать можно только матрицы типа a[mxn]*b[nxk],
получится матрица размера c[mxk].
0
85 / 69 / 12
Регистрация: 17.02.2011
Сообщений: 138
01.04.2011, 09:04 10
Можно сделать так, чтоб размерность массивов определялась по размерности гридов. Для этого массивы нужно задать как динамические. Ну например так.
Delphi
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
procedure TForm1.BitBtn4Click(Sender: TObject);
var i,j,l:integer;
n,k,m:integer;//n- количество строк первой матрицы,k- количество столбцов первой матрицы, должно совпадать с количеством строк второй, иначе произведение их невозможно,m-количество столбцов второй матрицы
c,a,b:array of array of integer;
begin
// Проверим, что произведение матриц возможно
 if  StringGrid4.ColCount<>StringGrid5.RowCount then
  begin
    ShowMessage('невозможно вычислить произведение матриц, так количество столбцов первого множителя не равно количеству строк второго');
    exit;//выходим из программы, раз вычисление невозможно
  end;
n:=StringGrid4.RowCount;
k:=StringGrid4.ColCount;
m:=StringGrid5.ColCount;
SetLength(a,n,k);
SetLength(b,k,m);
SetLength(c,n,m);
//Раз гриды имеют разные размерности и не квадратные то каждый массив определяется в своем цикле!!!
  for i:=0 to k-1 do
    for j:=0 to n-1 do
      a[j,i]:=strtoint(StringGrid4.cells[i,j]);
  for i:=0 to m-1 do
    for j:=0 to k-1 do
      b[j,i]:=strtoint(StringGrid5.cells[i,j]);
  for i:=0 to n-1 do
    for j:=0 to m-1 do
    begin
       c[i,j]:=0;
      for l:=0 to k-1 do        
        c[i,j]:=c[i,j] + a[i,l] * b[l,j];    
      StringGrid6.cells[j,i]:=inttostr(c[i,j]);
    end;
end;
Проверку на возможность перемножения матриц ввела для того, чтоб вы видели, что для гридов с вашими размерностями такое произведение невозможно
0
0 / 0 / 0
Регистрация: 31.12.2010
Сообщений: 21
01.04.2011, 18:46  [ТС] 11
Спасибо. Получилось тоже, но вашу ошибку(чтобы выдало мне) так и не увидел.
0
85 / 69 / 12
Регистрация: 17.02.2011
Сообщений: 138
01.04.2011, 20:16 12
я рада
0
01.04.2011, 20:16
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.04.2011, 20:16
Помогаю со студенческими работами здесь

Перемножение сцепленных матриц
Короче такая задача: Даны матрицы A(n,k), B(k,m). Умножить матрицы. Необходимо сделать тремя...

где ошибка?перемножение матриц
Вот такой код есть,который выдает ошибку if (stringgrid2.ColCount&lt;&gt;StringGrid3.RowCount) then...

Перемножение матриц (обработка двумерных массивов)
Всем доброй ночи! Пропустил двумерные массивы , не понимаю как написать программу:cry: Прошу у вас...

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


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru