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, Супермодераторы



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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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