2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2, 3  След.
 
 Произведение матриц
Сообщение04.01.2015, 18:08 
Аватара пользователя


27/03/14
1091
Хочу написать процедуру, для вычисления произведения двух матриц, но затрудняюсь. Не понимаю, как это сделать. Если у нас есть две матрицы и мы хотим узнать их произведение, то необходимо, чтобы число строк второй матрицы было равно числу столбцов первой. Другими словами, элементы матрицы $C$ размерами $m \times p$, являющейся произведением матриц $A$ размером $m \times n$ и $B$ размером $n \times p$ находятся по формуле: $c_{ik}=a_{ij}b_{jk}$. Как это реализовать на паскале? Как в процедуру умножения впаять две матрицы разных размеров?

 Профиль  
                  
 
 Re: Произведение матриц
Сообщение04.01.2015, 18:14 
Заслуженный участник


09/05/12
25179
Принципиально Вам ничего не мешает сделать функцию с двумя (как минимум) аргументами, каждый из которых - двумерный массив своего размера. Но для того, чтобы это было осмысленно, стоит познакомиться с динамическими массивами, благо что пишете Вы все равно на Delphi, где они есть как элемент языка.

 Профиль  
                  
 
 Re: Произведение матриц
Сообщение04.01.2015, 18:18 
Аватара пользователя


27/03/14
1091
Pphantom в сообщении #956320 писал(а):
Принципиально Вам ничего не мешает сделать функцию с двумя (как минимум) аргументами, каждый из которых - двумерный массив своего размера. Но для того, чтобы это было осмысленно, стоит познакомиться с динамическими массивами, благо что пишете Вы все равно на Delphi, где они есть как элемент языка.

Я вас правильно понял? В процедуре для вывода массива нужно возвращать в головную программу два массива? Т.е. вот так:
Используется синтаксис Pascal
procedure umnoj(var m,n,p:integer; var a,b:TMatrix);

 Профиль  
                  
 
 Re: Произведение матриц
Сообщение04.01.2015, 18:23 
Заслуженный участник


09/05/12
25179
А зачем возвращать два? Вам надо получить два массива, перемножить их и вернуть обратно один.

 Профиль  
                  
 
 Re: Произведение матриц
Сообщение04.01.2015, 18:25 
Аватара пользователя


27/03/14
1091
Pphantom в сообщении #956324 писал(а):
А зачем возвращать два? Вам надо получить два массива, перемножить их и вернуть обратно один.

Значит, я вывожу два массива по отдельности, а потом применяю процедуру перемножения?

 Профиль  
                  
 
 Re: Произведение матриц
Сообщение04.01.2015, 18:43 
Заслуженный участник


09/05/12
25179
fronnya в сообщении #956325 писал(а):
Значит, я вывожу два массива по отдельности,
А зачем их выводить?

Собственно, надо бы сначала четко сформулировать то, что Вы хотите получить в итоге.

 Профиль  
                  
 
 Re: Произведение матриц
Сообщение04.01.2015, 19:14 
Аватара пользователя


27/03/14
1091
Pphantom в сообщении #956331 писал(а):
fronnya в сообщении #956325 писал(а):
Значит, я вывожу два массива по отдельности,
А зачем их выводить?

Собственно, надо бы сначала четко сформулировать то, что Вы хотите получить в итоге.

Хочу сформировать и вывести матрицу $C$ как результат умножения двух матриц $A$ и $B$, про размеры я уже говорил. Я решил для матрицы $B$ написать отдельную процедуру, вот, что вышло :
код: [ скачать ] [ спрятать ]
Используется синтаксис Pascal
program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type TMatrix=array[1..100,1..100] of integer;


procedure TM(Var m,n:integer; Var a:TMatrix);
var
    i,j:integer;
begin
  randomize;
  writeln ('kol-vo strok: ');
  readln(m);
  writeln ('kol-vo stolbcov: ');
  readln(n);
  j:=1;
    while j<=n do
      begin
        i:=1;
          repeat
            a[i,j]:=random(6)-1;
            write(a[i,j]:3);
            i:=i+1;
          until i>m;
        writeln;
        j:=j+1;
      end;
end;

procedure TM1(n:integer; var p:integer; Var b:TMatrix);
var
    j,k:integer;
begin
  randomize;
  writeln ('kol-vo stolbcov: ');
  readln(p);
  k:=1;
    while k<=p do
      begin
        j:=1;
          repeat
            b[j,k]:=random(6)-1;
            write(b[j,k]:3);
            j:=j+1;
          until j>n;
        writeln;
        k:=k+1;
      end;
end;

procedure ymnog(m,n,p:integer; a,b:TMatrix; Var c:TMatrix);
var
    i,j,k:integer;
begin
  for i:=1 to m do
    begin
      for j:=1 to n do
        begin
          c[i,k]:=0;
            for k:=1 to p do
              begin
                c[i,k]:=a[i,j]*b[j,k]+c[i,k];
                write (c[i,k]:4);
              end;
              writeln;
        end;
    end;

end;

Var
    m,n,p:integer;
    a,b,c:TMatrix;

Begin
  TM(m,n,a);
  TM1(n,p,b);
  ymnog(m,n,p,a,b,c);
readln;
End.

 Профиль  
                  
 
 Re: Произведение матриц
Сообщение04.01.2015, 19:29 


27/08/14
207
fronnya, а Вы записи (структуры, record) проходили? Таскать из функции в функцию по отдельности массивы и их размеры не очень удобно.

 Профиль  
                  
 
 Re: Произведение матриц
Сообщение04.01.2015, 19:31 
Аватара пользователя


27/03/14
1091
Progger в сообщении #956347 писал(а):
fronnya, а Вы записи (структуры, record) проходили? Таскать из функции в функцию по отдельности массивы и их размеры не очень удобно.

Не проходили ничего. Статические массивы, операторы условия, циклы и там простейшие вещи.

 Профиль  
                  
 
 Re: Произведение матриц
Сообщение04.01.2015, 20:00 
Заслуженный участник


06/07/11
5627
кран.набрать.грамота
Пара вопросов:
1) размер матриц задан или нужно любой размер обрабатывать?
2) freepascal подойдет?

 Профиль  
                  
 
 Re: Произведение матриц
Сообщение04.01.2015, 20:13 
Аватара пользователя


27/03/14
1091
rockclimber в сообщении #956379 писал(а):
Пара вопросов:
1) размер матриц задан или нужно любой размер обрабатывать?
2) freepascal подойдет?

1)размер вводится с клавиатуры
2) главное, чтобы был ясен принцип.

 Профиль  
                  
 
 Re: Произведение матриц
Сообщение04.01.2015, 20:32 
Заслуженный участник


06/07/11
5627
кран.набрать.грамота
fronnya
Я не гарантирую, что в Delphi и других диалектах все будет работать в точности также (хотя скорее всего будет).
Во freepascal можно делать так:
Код:
// создаем двумерный динамический массив:
var
  a: array of array of integer;
  b: array of array of integer;
  i, j: integer;
begin
  // заполняем массив (числа, естественно, могут быть любыми - это вы сами потом допишите)
  setlength(a, 10, 10);
  for i:=0 to high(a) do
    for j:=0 to high(a[i]) do
      a[i, j] := <какое-нибудь значение>;

SetLength - процедура, которая задает размер динамического массива. Первый параметр - переменная типа array, последующие переменные - размеры массива (для одномерного массива переменная будет одна).
high - функция, которая возвращает максимальный индекс динамического массива.
Дальше попробуйте сами что-нибудь написать. Этих функций вам должно быть достаточно для решения вашей задачи.

 Профиль  
                  
 
 Re: Произведение матриц
Сообщение04.01.2015, 20:37 
Заслуженный участник


09/05/12
25179
rockclimber в сообщении #956407 писал(а):
high - функция, которая возвращает максимальный индекс динамического массива.
Надо бы еще уточнить, что минимальный в динамическом массиве Delphi всегда равен 0.

 Профиль  
                  
 
 Re: Произведение матриц
Сообщение04.01.2015, 20:44 
Аватара пользователя


27/03/14
1091
Подождите. Вы хотите меня научить, как строить динамические массивы ? В этой программе ведь это необязательно, я хочу сделать со статическими

 Профиль  
                  
 
 Re: Произведение матриц
Сообщение04.01.2015, 21:05 
Заслуженный участник


06/07/11
5627
кран.набрать.грамота
fronnya в сообщении #956416 писал(а):
Подождите. Вы хотите меня научить, как строить динамические массивы ? В этой программе ведь это необязательно, я хочу сделать со статическими
Значит так. Если в условии написано
fronnya в сообщении #956394 писал(а):
1)размер вводится с клавиатуры
то использовать динамический массив - обязательно (конечно, могут быть исключения, это это будут именно исключения). Тем более, что динамические массивы ничем не сложнее статических. А конкретно в вашей задаче - использовать динамический массив даже проще.

(Оффтоп)

Кто не согласен, тот пусть вместо программирования вышиванием займется.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 37 ]  На страницу 1, 2, 3  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot]


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group