(*~\Глагол\Отделы\ЧисАн\32\ц\~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
(**)                   ОТДЕЛ цМатрица;
(*============================================================================*
 * НАЗНАЧЕНИЕ: определение матриц из целых чисел (32 разряда)
 *              и основные вычисления над ними
 *============================================================================*)

ИСПОЛЬЗУЕТ
 цМатем   ИЗ "..\..\..\..\Отделы\ЧисАн\32\ц\",
 цВектор  ИЗ "..\..\..\..\Отделы\ЧисАн\32\ц\";
(*
 цМатрВВ  ИЗ "..\..\..\..\Отделы\ЧисАн\32\ц\ВводВывод\",

  НаЭкран ИЗ "..\..\..\..\Отделы\Обмен\ВводВывод\";
*)

ВИД
                    Вид- = РЯД ИЗ цВектор.Вид;
  Доступ-= ДОСТУП К Вид;

        (* вид Цел - это одинарная точность целых - 32 разряда *)
  Цел = цМатем.Цел;                                               (* локально *)

(*----------------------------------------------------------------------------*
 * Код ошибки после выполнения функций
 *----------------------------------------------------------------------------*)
ПОСТ
  ВЫРОЖДЕНА-           =-1;  (* вырожденная матрица *)
  НЕТ_СХОДИМОСТИ-      =-2;  (* нет сходимости *)
  НЕ_ПоложитОПРЕДЕЛЕНа-=-3;  (* матрица не является положительно определенной *)
(*
ПОСТ
  МАЛОЕ = 1.D-20;               (* вместо 0. с точностью 32 разряда *)
*)


(*-оооооооооооооо- опережающие определения/заготовки задач -ооооооооооооооооо-*)


(*----------------------------------------------------------------------------*)
ЗАДАЧА^ умнСтрокиНаСтолбец-(цВектСтрока-,цВектСтолбец-:цВектор.Вид):Цел;
(* Цель: умножение вектора-строки на вектор-столбец
 *)
(*----------------------------------------------------------------------------*)
ЗАДАЧА^ умнНаВектор-(цМатр-:цМатрица.Вид;             (* цМатр*цВход = цВыход *)
                     цВход-,цВыход+:цВектор.Вид);
(* Цель: умножение действительной матрицы <цМатр> на
 *         входной действительный  вектор <цВход> в <цВыход>         
 *)
(*----------------------------------------------------------------------------*)
ЗАДАЧА^ Перемножить-(L-,A+:цМатрица.Вид);
(* Цель: перемножение двух действ. матриц <L>*<L'>=<A>, где
                                              <L'> - транспонированная <L>    *)

(*----------------------------------------------------------------------------*
 * Переписывание действительных матриц, их строк и столбцов
 *----------------------------------------------------------------------------*)

ЗАДАЧА^ ОбменСтрок-   (A+:цМатрица.Вид; i,k:ЦЕЛ);
ЗАДАЧА^ ОбменСтолбцов-(A+:цМатрица.Вид; j,k:ЦЕЛ);

ЗАДАЧА^ Списать-(из-,в+:цМатрица.Вид);
ЗАДАЧА^ СписатьСтолбецИзВектора-(из-: цВектор.Вид; в+:цМатрица.Вид; стлб:ЦЕЛ);
ЗАДАЧА^ СписатьВекторИзСтолбца- (из-:цМатрица.Вид; в+: цВектор.Вид; стлб:ЦЕЛ);


(*=рррррррррррррррррррррррр= реализация задач =рррррррррррррррррррррррррррррр=*)


(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА умнСтрокиНаСтолбец-(цВектСтрока-,цВектСтолбец-:цВектор.Вид):Цел;
(*
 * Цель: умножение вектора-строки на вектор-столбец
 *----------------------------------------------------------------------------*
 * До:    <цВектСтрока>  - входная действ. вектор-строка
 *        <цВектСтолбец> - входной действ. вектор-столбец
 * После: действительная сумма произведений элементов входных векторов
 *)
ПЕР
            суммаП,
                     Произведение:Цел;                     (* временные целые *)
     j:ЦЕЛ;
            N:ЦЕЛ;                               (* размер вектора, N - любое *)
УКАЗ
(*-
  НаЭкран.ВсяЦепь("^ цМатрица.умнСтрокиНаСтолбец() ^");
-*)
            N:=РАЗМЕР(цВектСтолбец);
  ПРОВЕРИТЬ(N > 1);                           (* и остановить работу при N<=1 *)
(*
  цМатрВВ.наЭкран("^ цВектСтрока = %12d",цВектСтрока);
  цМатрВВ.наЭкран("^цВектСтолбец = %12d",цВектСтолбец);
*)
    суммаП:=0;            (* накопление в суммаП суммы произведений по j *)
  ОТ j:=0 ДО N-1 ВЫП
                     Произведение:=цВектСтрока[j]*цВектСтолбец[j];
    суммаП:=суммаП + Произведение;
(*-
          НаЭкран.Цел4числа("^ Произведение= %12d, суммаП=  %12d",
                               Произведение,
                                                   суммаП,          0, 0
                           );
          );
-*)
  КОН;
  ВОЗВРАТ суммаП
КОН умнСтрокиНаСтолбец;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА умнНаВектор-(цМатр-:цМатрица.Вид;              (* цМатр*цВход = цВыход *)
                    цВход-,
                    цВыход+:цВектор.Вид);
(*
 * Цель: умножение действительной матрицы <цМатр> на
 *         входной действительный  вектор <цВход> в <цВыход>
 *----------------------------------------------------------------------------*
 * До:    <цМатр> - входная действительная матрица из NxN
 *        <цВход> - входной  действительный временной вектор-сигнал из N,Y=X*M
 * После: <цВыход> - выходной действительный частотный вектор-спектр из N    
 *)
ПЕР
     i(*,j*):ЦЕЛ;
(*-
            суммаП,
                     Произведение:Цел;                     (* временные целые *)
-*)
            N:ЦЕЛ;                               (* размер вектора, N - любое *)
УКАЗ
(*-
НаЭкран.ВсяЦепь("^ цМатрица.умнНаВектор() ^");
-*)
            N:=РАЗМЕР(цВход);
  ПРОВЕРИТЬ(N > 1);                           (* и остановить работу при N<=1 *)
(*
  цМатрВВ.наЭкран("^цВход = %12d",цВход);
*)
  ОТ i:=0 ДО N-1 ВЫП
(*-
      суммаП:=0;          (* накопление в суммаП суммы произведений по j *)
    ОТ j:=0 ДО N-1 ВЫП
                       Произведение:=цМатр[i,j]*цВход[j];
      суммаП:=суммаП + Произведение;
(*-
          НаЭкран.Цел4числа("^ Произведение= %12d, суммаП=  %12d",
                               Произведение,
                                                   суммаП,          0, 0
                           );
-*)
    КОН;
    цВыход[i]:=суммаП
-*)
    цВыход[i]:=умнСтрокиНаСтолбец(цМатр[i],цВход);
  КОН;
(*
  дМатрВВ.ВыводВПоток("^цВыход = %20.16e",цВыход^);
*)
КОН умнНаВектор;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА Перемножить-(L-,A+:цМатрица.Вид);
(*
 * Цель: перемножение двух действ. матриц <L>*<L'>=<A>, где
 *                                            <L'> - транспонированная <L>   
 *)
ПЕР
  i,j,k(*,n*):ЦЕЛ;
  summaProizv:Цел;
УКАЗ
(*n:=РАЗМЕР(L);*)
  ОТ i:=0 ДО РАЗМЕР(L)-1 ВЫП
    ОТ j:=0 ДО i ВЫП
      summaProizv:=0;
      ОТ k:=0 ДО j ВЫП
        summaProizv:=summaProizv + L[i,k]*L[j,k]
      КОН;
      A[i,j]:=summaProizv;
      ЕСЛИ i # j ТО
        A[j,i]:=summaProizv 
      КОН
    КОН 
  КОН
КОН Перемножить;


(*============================================================================*
 * Переписывание действительных матриц, их строк и столбцов
 *============================================================================*)

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА ОбменСтрок-(A+:цМатрица.Вид; i,k:ЦЕЛ);
ПЕР
     j:ЦЕЛ;
УКАЗ
  ОТ j:=0 ДО РАЗМЕР(A,1)-1 ВЫП
    цМатем.обмен(A[i,j],A[k,j]) 
  КОН
КОН ОбменСтрок;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА ОбменСтолбцов-(A+:цМатрица.Вид; j,k:ЦЕЛ);
ПЕР
     i:ЦЕЛ;
УКАЗ
  ОТ i:=0 ДО РАЗМЕР(A,0)-1 ВЫП
    цМатем.обмен(A[i,j],A[i,k])
  КОН
КОН ОбменСтолбцов;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА Списать-(из-,в+:цМатрица.Вид);
ПЕР
  i,j:ЦЕЛ;
УКАЗ
  ОТ i:=0 ДО   цМатем.мин(РАЗМЕР(из,0),РАЗМЕР(в,0))-1 ВЫП
    ОТ j:=0 ДО цМатем.мин(РАЗМЕР(из,1),РАЗМЕР(в,1))-1 ВЫП
      в[i,j]:=из[i,j] 
    КОН 
  КОН
КОН Списать;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА СписатьСтолбецИзВектора-(из-: цВектор.Вид;
                                 в+:цМатрица.Вид; стлб:ЦЕЛ);
ПЕР                          (* из[] -> в[,стлб] *)
     i:ЦЕЛ;
УКАЗ
  ОТ i:=0 ДО цМатем.мин(РАЗМЕР(из),РАЗМЕР(в,0))-1 ВЫП
    в[i,стлб]:=из[i]
  КОН
КОН СписатьСтолбецИзВектора;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА СписатьВекторИзСтолбца-(из-:цМатрица.Вид;
                                в+: цВектор.Вид; стлб:ЦЕЛ);
ПЕР                         (* из[,стлб] -> в[] *)
  i:ЦЕЛ;
УКАЗ
  ОТ i:=0 ДО цМатем.мин(РАЗМЕР(из,0),РАЗМЕР(в))-1 ВЫП
    в[i]:=из[i,стлб]
  КОН
КОН СписатьВекторИзСтолбца;

КОН цМатрица.
