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

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

кнЦОС     ИЗ "..\..\..\..\..\Отделы\ЦОС\64\к\Набор\";

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

ВИД
                     Вид- = РЯД ИЗ кнВектор.Вид; (* матрица из компл.чисел в виде набора из 2-х вещ. *)
  Доступ- = ДОСТУП К Вид;               (* доступ к матрице из компл.чисел в виде набора из 2-х вещ. *)

        (* вид Вещ - это удвоенная точность 64 разряда (16 десятичных знаков) *)
  Вещ = дМатем.Вещ;                   (* локально *)


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


(*----------------------------------------------------------------------------*
 * арифметические действия над матрицами из комплексных в виде набора из 2-х вещ.
 *----------------------------------------------------------------------------*)

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

(*----------------------------------------------------------------------------*)
 (*
ЗАДАЧА^ умнНаВещ-(кВход- :Вид; v:Вещ;
                  кВыход+:Вид);    (* кВыход:=кВход*v - умножение матрицы на вещ. v *)
ЗАДАЧА^ делНаВещ-(кВход- :Вид; v:Вещ;
                  кВыход+:Вид);    (* кВыход:=кВход/v - деление   матрицы на вещ. v *)
 *)
ЗАДАЧА^ увеличВдейств-(        v:Вещ;
                  кМатр+:Вид);     (* кМатр *= v - увеличить себя в действ. число v раз *)
ЗАДАЧА^ уменьшВдейств-(        v:Вещ;
                  кМатр+:Вид);     (* кМатр /= v - уменьшить себя в действ. число v раз *)
 (*
ЗАДАЧА^ умнНаКомпл-(кВход- :Вид; w-:кнМатем.Вид;
                    кВыход+:Вид);  (* кВыход:=кВход*w - умножение матрицы на компл. w *)
ЗАДАЧА^ делНаКомпл-(кВход- :Вид; w-:кнМатем.Вид;
                    кВыход+:Вид);  (* кВыход:=кВход/w - деление   матрицы на компл. w *)

ЗАДАЧА^ увеличВкомпл-(           w-:кнМатем.Вид;
                     кМатр+:Вид);  (* кМатр *= w - увеличить себя в компл. число w раз *)
ЗАДАЧА^ уменьшВкомпл-(           w-:кнМатем.Вид;
                     кМатр+:Вид);  (* кМатр /= w - уменьшить себя в компл. число w раз *)
  *)


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

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



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


(*============================================================================*
 * арифметические действия над матрицами из комплексных в виде набора из 2-х вещ.
 *============================================================================*)

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

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

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

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

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

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


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

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

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА увеличВдейств-(          v:Вещ;
                  кМатр+:Вид);     (* кМатр *= v - увеличить себя в действ. число v раз *)
(*
 * Цель: самоумножение компл.матрицы <кМатр> из компл.чисел вида кнМатем.Вид,
 *              на вещественное v => <кМатр>
 *)
ПЕР
          (* N0,N1,*) (* размеры вх.матрицы = рабочие размеры вх.матрицы N0xN1 - любые заданные *)
          (* N:ЦЕЛ; *)    (* размер матрицы = рабочая длина матрицы N - любая заданная *)
    i,j:ЦЕЛ;
УКАЗ                (* нормировка на вещественное v
                             матрицы <кМатр> из компл.чисел вида кнМатем.Вид, т.е набора из 2-х вещ.
                     *)
          (* N:=РАЗМЕР(кМатр,0); *)
  ОТ i:=0 ДО    РАЗМЕР(кМатр,0)-1 ВЫП
    ОТ j:=0 ДО  РАЗМЕР(кМатр,1)-1 ВЫП
      кнМатем.увеличВдейств(v,кМатр[i,j])       (* кМатр[i,j] = кМатр[i,j]*v  *)
    КОН
  КОН
КОН увеличВдейств;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА уменьшВдейств-(        v:Вещ;
                  кМатр+:Вид);   (* кМатр /= v - уменьшить себя в действ. число v раз *)
(*
 * Цель: самоделение компл.матрицы <кМатр> из компл.чисел вида кнМатем.Вид,
 *            на вещественное v => <кМатр>
 *)
ПЕР
          (* N0,N1,*) (* размеры вх.матрицы = рабочие размеры вх.матрицы N0xN1 - любые заданные *)
          (* N:ЦЕЛ; *)    (* размер матрицы = рабочая длина матрицы N - любая заданная *)
  обр_v:Вещ;
    i,j:ЦЕЛ;
УКАЗ                (* нормировка на вещественное v
                             матрицы <кМатр> из компл.чисел вида кнМатем.Вид, т.е набора из 2-х вещ.
                     *)
  обр_v:=1/v;
          (* N:=РАЗМЕР(кМатр,0); *)
  ОТ i:=0 ДО    РАЗМЕР(кМатр,0)-1 ВЫП
    ОТ j:=0 ДО  РАЗМЕР(кМатр,1)-1 ВЫП
(*
      кнМатем.уменьшВдейств(    v,кМатр[i,j])(* кМатр[i,j] = кМатр[i,j]/v     *)
*)
      кнМатем.увеличВдейств(обр_v,кМатр[i,j])(* кМатр[i,j] = кМатр[i,j]*обр_v *)
    КОН
  КОН
КОН уменьшВдейств;

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

