(*~\Глагол\Отделы\ЧисАн\64\к\Пара\~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
(**)                        ОТДЕЛ кпМатрица;
(*============================================================================*
 * НАЗНАЧЕНИЕ: определение матриц из комплексных чисел,
 *          в виде пары <дВход,мВход> вещ.матриц вида дМатрица.Вид
 *                                        из вещественных вида дМатем.Вещ
 *                     и основные вычисления над этими комплексными матрицами
 *============================================================================*)

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

кпМатем   ИЗ "..\..\..\..\..\Отделы\ЧисАн\64\к\Пара\"; (* = дМатем.Вещ *)
(*
кпВектор  ИЗ "..\..\..\..\..\Отделы\ЧисАн\64\к\Пара\";
кпВектВВ  ИЗ "..\..\..\..\..\Отделы\ЧисАн\64\к\Пара\ВводВывод\",
кпМатрВВ  ИЗ "..\..\..\..\..\Отделы\ЧисАн\64\к\Пара\ВводВывод\",

кпЦОС     ИЗ "..\..\..\..\..\Отделы\ЦОС\64\к\Пара\";

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

ВИД                                  
        (* вид Вещ - это удвоенная точность 64 разряда (16 десятичных знаков) *)
  Вещ = дМатем.Вещ;                   (* локально *)
(*
                     Вид- = РЯД ИЗ дВектор.Вид;  (* матрица из вещ.чисел, пара матриц = компл.матрице *)
                 или
                     Вид- = РЯД ИЗ
                            РЯД ИЗ Вещ;          (* матрица из вещ.чисел, пара матриц = компл.матрице *)
  Доступ- = ДОСТУП К Вид;               (* доступ к матрице из вещ.чисел, пара матриц = компл.матрице *)
*)


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


(*----------------------------------------------------------------------------*
 * арифметические действия над компл.матрицами в виде пары <дВход,мВход> вещ.матриц
 *----------------------------------------------------------------------------*)

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

(*----------------------------------------------------------------------------*
 * Переписывание матриц из комплексных в виде пары вещ.матриц
 *----------------------------------------------------------------------------*)

ЗАДАЧА^ Списать-(дВхМатр-, мВхМатр-,
                 дВыхМатр+,мВыхМатр+:дМатрица.Вид
                );


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


(*============================================================================*
 * арифметические действия над компл.матрицами в виде пары <дВход,мВход> вещ.матриц
 *============================================================================*)

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

  дМатрВВ.наЭкран("^ кВектСтрока  = %20.16e",дВектСтрока, мВектСтрока);
  дМатрВВ.наЭкран("^ кВектСтолбец = %20.16e",дВектСтолбец,мВектСтолбец);
*)
          дСуммаП:=0;         (* накопление в дСуммаП суммы произведений по j *)
          мСуммаП:=0;         (* накопление в мСуммаП суммы произведений по j *)
  ОТ j:=0 ДО N-1 ВЫП
    кпМатем.суммаПроизведений(дВектСтрока[j],мВектСтрока[j],
                             дВектСтолбец[j],мВектСтолбец[j],дСуммаП,мСуммаП);
  КОН;
(*ВОЗВРАТ кСуммаП*)
КОН умнСтрокиНаСтолбец;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
                 (* кМатр*кВход = кВыход *)
ЗАДАЧА умнНаВектор-(дМатр-, мМатр- :дМатрица.Вид;
                    дВход-, мВход-,
                    дВыход+,мВыход+: дВектор.Вид
                   );
(* Цель: умножение комплексной матрицы, представленной в виде
 *           пары  <дМатр, мМатр>  вещ.матриц  из NxN на
 *        входной комплексный временной вектор-сигнал, представленный
 *    в виде пары  <дВход, мВход>  вещ.векторов
 * Результат: выходной комплексный временной вектор-спектр, представленный
 *    в виде пары  <дВыход,мВыход> вещ.векторов
 *                 <дВыход,мВыход>:=<дМатр,мМатр>*<дВход,мВход>;
 *----------------------------------------------------------------------------*
 * До:    <дМатр,мМатр> - входная  комплексная матрица
 *                           в виде пары вещ.матриц  из NxN
 *        <дВход,мВход> - входной комплексный временной вектор-сигнал
 *                            в виде пары вещ.векторов -
 *                       временной сигнал(ДПФ)/спектр(ОДПФ) из N, Y=X*Mij
 * После: <дВыход,мВыход> - выходной комплексный частотный вектор-спектр
 *                            в виде пары вещ.векторов -
 *                       частотный спектр(ДПФ)/временной сигнал(ОДПФ) из N   
 *)
ПЕР
  дYi,   мYi,
  дXjМij,мXjМij:Вещ;  (* = кпМатем.Вид *)  (* временные комплексные в виде пары вещ. *)

  i,j:ЦЕЛ;
            N:ЦЕЛ;       (* размер вектора = рабочая длина вектора N - любая заданная *)
УКАЗ
            N:=РАЗМЕР(дВход);
  ПРОВЕРИТЬ(N > 1);                           (* и остановить работу при N<=1 *)
(*
  НаЭкран.ВсяЦепь("^ кпМатрица.умнНаВектор() ^");

  кпВектВВ.наЭкран("^ дВход,мВход = (%20.16e;%20.16e)",дВход,мВход);
*)
  ОТ i:=0 ДО N-1 ВЫП
                                   (* накопление в Yi суммы комплексных по j  *)
    дYi:=кпМатем.дКомплексногоНОЛЯ;
    мYi:=кпМатем.мКомплексногоНОЛЯ;

    ОТ j:=0 ДО N-1 ВЫП
(*
      кпМатем.суммаПроизведений(
                  дМатр[i,j],мМатр[i,j],
                       дВход[ j ],мВход[ j ], дXjМij,мXjМij);
*)
      кпМатем.умножить(дВход[ j ],мВход[ j ],
                  дМатр[i,j],мМатр[i,j],      дXjМij,мXjМij);
(* накопление по j в Yi суммы произведений
                                             <дXjМij;мXjМij> = кВход[j]*кМатр[i,j] *)
      кпМатем.добавить(                       дXjМij,мXjМij,
                       дYi,мYi);                   (* Yi += <дXjМij;мXjМij>   *)
(*-
     НаЭкран.Вещ4числа("^дXjМij,мXjМij= (%20.16e; %20.16e), дYi= %20.16e, мYi= %20.16e",
                         дXjМij,
                                мXjМij,
                                                            дYi,
                                                                          мYi
          );
-*)
    КОН;
    дВыход[i]:=дYi;
    мВыход[i]:=мYi
  КОН;
(*
  кпВектВВ.наЭкран("^ дВыход,мВыход = (%20.16e;%20.16e)",дВыход,мВыход);
*)
КОН умнНаВектор;


(*============================================================================*
 * Переписывание компл.матрицы из в виде пары <дВход,мВход> вещ.матриц
 *============================================================================*)

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

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