IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> умножение кв. матриц
Insomnia
сообщение 6.06.2011 20:57
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 49
Пол: Мужской

Репутация: -  0  +


Условие и состоит в том что бы перемножить 2 квадратные матрицы
program ymnoz_matr_on_matr;

{$APPTYPE CONSOLE}

uses
SysUtils,
windows;

const
n=3;
m=3;
r=3;
type
TElem=integer;
TMatrixA=array [1..n,1..n] of TElem;
TMAtrixB=array[1..m,1..m] of TElem;
TMatrixC=array[1..r,1..r] of TElem;
var
A: TMatrixA;
B: TMAtrixB;
C: TMAtrixC;

procedure input_matrixs (var A: TMatrixA;n: TElem;var B: TMAtrixB;m: TElem);
var i,j,k,l: integer;
begin
writeln('введите матрицу А');
for i:=1 to n do
begin
for j:=1 to n do
read(A[i,j]);
readln
end;
writeln('введите матрицу B');
for k:=1 to m do
begin
for l:=1 to m do
read(B[k,l]);
readln
end;
end;

procedure Ym_matr_on_matr(A: TMatrixA;B: TMatrixB;var C: TMatrixC;r: TElem);// умножение матриц
var p,f: integer;
//---------
function Scalar_Vector_A_on_Vector_B (Row,Col: integer): TElem;//умножение строки Row матрицы А и столбца Col матрицы B
var i,j: integer;
begin
result:=0;
i:=0;
for j:=1 to n do
inc(i);
result:=A[Row,j]*B[i,Col]+result;
end;

begin
for p:=1 to r do
begin
for f:=1 to r do
C[p,f]:= Ym_matr_on_matr(i,j);
end;

procedure print_matrixC (C: TMatrixC;r: TElem);
var
p,f: integer;
begin
writeln('матрица С');
for p:=1 to r do
begin
for f:=1 to r do
write(C[p,f],' ');
writeln
end;
end;

begin
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
input_matrixs(A,n,B,m);
Ym_matr_on_matr(A,B,C,r);
print_matrixC(C,r);
readln
end.


запутался в функции (и процедуре). Идея в том что бы умножить 1 строку и 1 столбец матриц , а потом создать цикл обхода по двум матрицам и использовать вспомогательную функцию.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
IUnknown
сообщение 8.06.2011 10:58
Сообщение #2


a.k.a. volvo877
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской

Репутация: -  627  +


Цитата
Правда я никак не могу представить, функция у нас возвращает строку и столбец, которые мы в процедуре заполняем, пробегая по циклу матрицы С, верно? получается что result хранит большое выражение ( " A [RowA, 1] * B [1, ColB] + A [RowA, 2]* B [2, ColB] + A [RowA, 3] * B [3, ColB] ; для i = 1 " )
Нет. Функция возвращает число (оно и из названия понятно: скалярное произведение вектора A на вектор B) - результат умножения строки RowA матрицы A на столбец RowB матрицы B. Чтобы вычислить матрицу- результат, надо КАЖДУЮ строку A умножить на КАЖДЫЙ столбец B, чем и занимается сама процедура. Что называется, "разделяй и властвуй". Задача была разбита на подзадачи. Вместо того, чтобы делать три вложенных цикла, ограничились двумя, перебирающими все нужные комбинации векторов. И функцией, которая самостоятельно выполняет третий цикл, перемножая два конкретных вектора.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 24.06.2025 22:43
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"