Разное - [решено] Помогите с программой для Turbo Pascal (умножение матриц)

Ответить
 • Просмотры: 1
Аватара пользователя
dasha131

Разное - [решено] Помогите с программой для Turbo Pascal (умножение матриц)

Сообщение dasha131 »

ПОмогите пожалуйста составить программу для вычисения произведения матриц A,B,C каждая из которых имеет размерность nxn



ВОт составленная мною часть проги, где вводятся сами матрицы, проверьте пожалуйста

program ABC;

var

matrA: array[1..500,1..500] of integer;

matrB: array[1..500,1..500] of integer;

matrC: array[1..500,1..500] of integer;

i: integer;

j: integer;



begin

for i:=1 to n do

for j:=1 to n do

begin

read matrA[i,j];

end;

begin

read matrB[i,j];

end;

begin

read matrC[i,j];

end;
Аватара пользователя
Hector

Re: Разное - [решено] Помогите с программой для Turbo Pascal (умножение матриц)

Сообщение Hector »

в принципе правильно, вот только нет ввода n и вместо оператора read лучше использовать readln imho, неплохо бы было выводить приглашение на ввод данных. размерность матриц лучше задавать через константу



Код:

Код: Выделить всё

const
R=500;
var
matrA: array[1..R,1..R] of integer;

ввод матриц я бы организовал процедурой

p. s. используйте тег CODE
Аватара пользователя
dasha131

Re: Разное - [решено] Помогите с программой для Turbo Pascal (умножение матриц)

Сообщение dasha131 »

Вот готово, замечания будут?



Код:

Код: Выделить всё

program ABC;
const NMax = 10;
type Matrix = array [1..NMax, 1..NMax] of Real;  
procedure 1MulMatrix(var a, b, c: Matrix; n: Integer);
var  i, j, k: Integer;
     s: Real;
begin
     for i := 1 to n do
     for j := 1 to n do
     begin
          s := 0;
          for k := 1 to n do
          s := s + a[i, k]*b[k, j];
          c[i, j] := s
     end
end;
procedure 2MulMatrix(var c, d, e: Matrix; n: Integer);
var  i, j, k: Integer;
     s: Real;
begin
     for i := 1 to n do
     for j := 1 to n do
     begin
          s := 0;
          for k := 1 to n do
          s := s + c[i, k]*d[k, j];
          e[i, j] := s
     end
end;
var  a, b, c,d,e: Matrix;
     i, j, n: Integer;
begin
     WriteLn('vvedite poradok matrix');
     Write('n = '); ReadLn(n);
     WriteLn('vvedite pervyu');
     for i := 1 to n do
     for j := 1 to n do
     Read(a[i, j]);
     WriteLn('vvedite vtoryu');
     for i := 1 to n do
     for j := 1 to n do
     Read(b[i, j]);
 WriteLn('vvedite tretu');
     for i := 1 to n do
     for j := 1 to n do
     Read(d[i, j]);
     MulMatrix(a, b, c, n);
     MulMatrix(c, d, e, n);
     for i := 1 to n do
 begin
          for j := 1 to n do
          Write(e[i, j]:0:6, ' ');
          WriteLn
     end;
     ReadLn
end.
Аватара пользователя
dasha131

Re: Разное - [решено] Помогите с программой для Turbo Pascal (умножение матриц)

Сообщение dasha131 »

Ну все, причина найдена



MulMatrix(a, b, d, n); d:=MulMatrix(a,b,d,n);

MulMatrix(d, c, e, n); e:=MulMatrix(c,d,e,n);



у нас он вы чиcлял как C*AB , а в планах было AB*C

хоты разницы особой нет, по свойству матриц A*B=B*A но все же лучше будет записать

MulMatrix(a, b, d, n);

MulMatrix(d, c, e, n);

Все правильно?Изображение
Аватара пользователя
dasha131

Re: Разное - [решено] Помогите с программой для Turbo Pascal (умножение матриц)

Сообщение dasha131 »

Цитата dasha131:



D[i,j] := D[i,j] + (A[i,j]*B[j,i])*C[j,i];

Вот формула
Разное - [решено] Помогите с программой для Turbo Pascal (умножение матриц)




судя по формуле это не перемножение матриц, а просто алгоритм вычисления значения элемента матрицы D на основании соответствующих элементов предыдущих 3 матриц, тогда просто это надо выполнить в цикле
Аватара пользователя
Hector

Re: Разное - [решено] Помогите с программой для Turbo Pascal (умножение матриц)

Сообщение Hector »

Цитата dasha131:



блок const не надо смешивать с блоком var.



Код:

Код: Выделить всё

program ABC;
const
R=500;
var
matr1,matr2,matr3,matr4: array[1..R,1..R] of real;
i,j,m,n,p,s,g: integer;
S:real;
Begin
   read (g) {размерность матрицы gxg}
   for i:=1 to g do
   for j:=1 to g do
   begin
     read(matr1[i,j]);
   end;
   for m:=1 to g do
   for n:=1 to g do 
   begin
     read(matr2[m,n]);
   end;
   for p:=1 to g do
   for s:=1 to g do
   begin
     read(matr3[p,s]);
   end;

Разное - [решено] Помогите с программой для Turbo Pascal (умножение матриц)




Решение простое, "в лоб" можно конечно улучшить, но работать будет без проблем.


Цитата dasha131:



Может поможете дальше с программой?
Разное - [решено] Помогите с программой для Turbo Pascal (умножение матриц)




Посмотри
здесь


И вид общей формулы
тут


Результирующую матрицу получать в 2 этапа. Сначала 1*2, затем получившее*3;

Процедуры и функции проходили? Они бы сейчас очень пригодились.
Аватара пользователя
dasha131

Re: Разное - [решено] Помогите с программой для Turbo Pascal (умножение матриц)

Сообщение dasha131 »

Это не данная формула)) Значит моя ошибка(

МОжет поможете дальше с программой?
Аватара пользователя
lxa85

Re: Разное - [решено] Помогите с программой для Turbo Pascal (умножение матриц)

Сообщение lxa85 »

Цитата dasha131:



Почему так записали 31-33ю строчки, почему begin между?
Разное - [решено] Помогите с программой для Turbo Pascal (умножение матриц)




это вывод матрицы, внешний цикл выбирает номер строки, а в его теле внутренний выводит значение элементов, а пустой writeln переводит каретку (чтоб красиво было Изображение )


Цитата dasha131:



И еще непонятно значение строчек 35,37
Разное - [решено] Помогите с программой для Turbo Pascal (умножение матриц)




37 строка просто задержка, чтобы программа после выполнения сразу не закрывалась


Цитата dasha131:



почему вконце 14 и 15й строчек не ставится ";" ?
Разное - [решено] Помогите с программой для Turbo Pascal (умножение матриц)




код тестировали? imho просто ошибка, забыли поставить


Цитата dasha131:



разобрать цикл с 4-15строчки
Разное - [решено] Помогите с программой для Turbo Pascal (умножение матриц)




это реализация математического метода умножения матриц
Аватара пользователя
dasha131

Re: Разное - [решено] Помогите с программой для Turbo Pascal (умножение матриц)

Сообщение dasha131 »

Цитата Hector:



код тестировали? imho просто ошибка, забыли поставить
Разное - [решено] Помогите с программой для Turbo Pascal (умножение матриц)




ВОт это то самое и интересное, все тестировалось, и работало прекрасно без ";" ну и как это объяснить?



А чтобы перемножать три матрицы, нужно новый цикл писать "MulMatrix(var c, d, e: Matrix; n: Integer)" ??
Ответить

Вернуться в «Программирование и базы данных»