Компания ALT Linux
Опубликован: 10.04.2015 | Доступ: свободный | Студентов: 763 / 0 | Длительность: 14:03:00
Специальности: Программист, Преподаватель
Лекция 6:

Обработка матриц в Паскале

< Лекция 5 || Лекция 6: 123456 || Лекция 7 >
ЗАДАЧА 6.10. Написать программу умножения двух матриц: A(N, M ) и B(M, L).

Напомним некоторые сведения из курса математики. Умножать можно только матрицы, у которых количество столбцов в первой матрице совпадает с количеством строк во второй матрице. Матрица-произведение имеет столько строк, сколько было в первой матрице и столько столбцов, сколько было во второй. Таким образом, при умножении матрицы A(N,M) на матрицу B(M,L) получается матрица C(N,L). Каждый элемент матрицы C[i,j] является скалярным произведением i-й строки матрицы A и j-го столбца матрицы B. В общем виде формула для нахождения элемента c_{i,j} матрицы имеет вид:

Блок-схема умножения двух матриц

Рис. 6.29. Блок-схема умножения двух матриц
c_{i,j}=\sum\limits_{k=1}^{M}a_{ik}b_{kj}, ( 6.1)

где i = 1,..., N и j = 1,..., L.

Рассмотрим более подробно формирование матрицы C(3,2) как произведения матриц A(3,3) и B(3,2).

\left(\begin{matrix} 
c_{11}&c_{12}\\
c_{21}&c_{22}\\
c_{31}&c_{32}\end{matrix}\right)=
\left(\begin{matrix}
a_{11}b_{11}+a_{12}b_{21}+a_{13}b_{31}&
a_{11}b_{12}+a_{12}b_{22}+a_{13}
b_{32}\\
a_{21}b_{11}+a_{22}b_{21}+a_{23}b_{31}&
a_{21}b_{12}+a_{22}b_{22}+a_{23}b_{32}\\
a_{31}b_{11}+a_{32}b_{21}+a_{33}b_{31}&
a_{31}b_{12}+a_{32}b_{22}+a_{33}b_{32}
\end{matrix}\right).

Следует помнить, что A \cdot B \not = B \cdot A.

Блок-схема, реализующая умножение каждого элемента матрицы C по формуле (6.1), приведена на рис. 6.29.

Ниже приведён текст программы умножения двух матриц с комментариями.

type
	matrica=array [ 1.. 15, 1.. 15 ] of real;
var
	a, b, c : matrica;
	i, j,M,N, L, k : byte;
begin
	//Ввод размеров матриц.
	writeln ( ’введите n,m и  l ’ );
	readln (N, M, L );
//Ввод матрицы A.
	writeln ( ’Матрица A ’ );
	for i :=1 to N do
		for j :=1 to M do
			read ( a [ i, j ] );
//Ввод матрицы B.
	writeln ( ’Матрица B ’ );
	for i :=1 to M do
		for j :=1 to L do
			read ( b [ i, j ] );
//Формирование матрицы C.
	for i :=1 to N do
		for j :=1 to L do
		begin
{В C[i,j] будет храниться результат скалярного}
{умножения i-й строки на j-й столбец.}
			c [ i, j ] : = 0;
			for k:=1 to M do
				c [ i, j ] : = c [ i, j ]+a [ i, k ] * b [ k, j ];
		end;
//Вывод матрицы C=AB.
	writeln ( ’матрица C=A*B ’ );
	for i :=1 to N do
	begin
		for j :=1 to L do
			write ( c [ i, j ] : 7 : 3, ’   ’ );
		writeln;
	end;
end.

Результат работы представлен на рис. 6.30.

Результаты работы программы умножения двух матриц

Рис. 6.30. Результаты работы программы умножения двух матриц
< Лекция 5 || Лекция 6: 123456 || Лекция 7 >
Юрий Шутиков
Юрий Шутиков

По первому тесту выполнил дважды задания. Результат получается правильный (проверял калькулятором). Пишет, что "Задание не проверено" и предлагает повторить. 
 

Евгений Силуков
Евгений Силуков

Еще в декабре выполнил тест №1, а его все так и не проверили.