MatrixInfo

Метод анализирует содержимое матрицы, определяет её структурный тип (симметричная, эрмитова, треугольная, ленточная и т.д.) и заполняет структуру MqlMatrixInfo.

bool matrix::MatrixInfo(
  MqlMatrixInfo&  info      // информация о матрице
   );

Параметры

info

[out]  Объект типа MqlMatrixInfo, куда помещается информация о матрице.

Возвращаемое значение

Возвращает true, если матрица инициализирована и имеет ненулевую размерность. В противном случае возвращается false.

Примечание

Объект структуры MqlMatrixInfo содержит больше информации, чем могут дать отдельные методы классификации матриц (IsSymmetric, IsHermitian, IsUpperTriangular и т.д.)

Структура MqlMatrixInfo

struct MqlMatrixInfo
  {
    ushort            version,          // 5940
   char              signature[2],     // "GE", "SY", "HE", "TR", ...
   ENUM_BLAS_TYPE    matrix_class,     // BLASTYPE_GE, BLASTYPE_SY, BLASTYPE_HE и т.д., должно соответствовать полю signature
   ENUM_DATATYPE     data_type,        // TYPE_MATRIXD, TYPE_MATRIXF, TYPE_MATRIXCD, TYPE_MATRIXCF
    uint              flags,            // MATRIX_UPPER, MATRIX_LOWER, MATRIX_UNITDIAG, ...
    ulong             rows,             // строки матрицы
    ulong             cols,             // столбцы матрицы
    long              lower_bandwidth,  // kl: число потенциально ненулевых поддиагоналей
    long              upper_bandwidth,  // ku: число потенциально ненулевых наддиагоналей
    ulong             data_size,        // размер следующего блока данных в байтах
  };

Информация из структуры MqlMatrixInfo используется при записи матрицы в файл (метод Write будет добавлен позже) и при чтении матрицы из файла.

ENUM_BLAS_TYPE

Перечисление, содержащее тип распознанной матрицы.

ID

Описание

BLASTYPE_GE

'GE': матрица общего вида

BLASTYPE_BD      

'BD': двухдиагональная матрица

BLASTYPE_DI

'DI': диагональная матрица

BLASTYPE_GB

'GB': ленточная матрица общего вида

BLASTYPE_GT

'GT': трёхдиагональная матрица общего вида

BLASTYPE_HB

'HB': эрмитова ленточная матрица

BLASTYPE_HE

'HE': эрмитова матрица

BLASTYPE_HT

'HT': эрмитова трёхдиагональная матрица

BLASTYPE_HS

'HS': матрица Хессенберга

BLASTYPE_SB

'SB': симметричная ленточная матрица

BLASTYPE_ST

'ST': симметричная трёхдиагональная матрица

BLASTYPE_SY

'SY': симметричная матрица

BLASTYPE_TB

'TB': треугольная ленточная матрица

BLASTYPE_TR

'TR': треугольная матрица

BLASTYPE_TZ

'TZ': трапециевидная матрица

BLASTYPE_VE

'VE': вектор (пока не используется)

Имена элементов перечисления соответствуют сокращениям, используемым в LAPACK для обозначения различных классов матриц. Исключение составляет тип HT - эрмитова трёхдиагональная матрица. Тип HT отсутствует в стандартной терминологии LAPACK и введён по аналогии с ST (симметричная трёхдиагональная матрица) для обозначения эрмитовой трёхдиагональной матрицы, что также позволяет компактно хранить соответствующую матрицу.

MqlMatrixInfo::flags

Флаги, уточняющие распознанный тип матрицы.

ID

Значение

Описание

MATRIX_UPPER

0x0001

верхняя часть выше главной диагонали

MATRIX_LOWER      

0x0002

нижняя часть ниже главной диагонали

MATRIX_UNITDIAG

0x0004

главная диагональ содержит только единицы (1)

MATRIX_DIAGSCALAR

0x0008

главная диагональ содержит одинаковые значения

MATRIX_QUASI_TRIANGULAR

0x0010

возможная квазитреугольная матрица

MATRIX_TRIANGLE_RIGHT_ALIGNED

0x0020

верхняя треугольная часть выровнена по правой границе широкой матрицы

MATRIX_TRIANGLE_BOTTOM_ALIGNED

0x0040

нижняя треугольная часть выровнена по нижней границе высокой матрицы

Перечисленные флаги (кроме MATRIX_QUASI_TRIANGULAR) позволяют более компактно хранить матрицы.

 

Пример:

   ulong   n=10;
   matrix  matrix_a=matrix::Random(n,n);
   vectorc vector_ev;
   matrix  matrix_t,matrix_z;
   MqlMatrixInfo info;
   
   matrix_a.EigenSolverSchur(EIGSCHUR_V,vector_ev,matrix_t,matrix_z);
   matrix_t.MatrixInfo(info);
   PrintFormat("%d, %c%c, %s, %s, 0x%04x, rows=%I64u, cols=%I64u, lower_bandwidth=%I64d, upper_bandwidth=%I64d",info.version,info.signature[0],info.signature[1],EnumToString(info.matrix_class),
                                                                                                                EnumToString(info.data_type),info.flags,info.rows,info.cols,
                                                                                                                info.lower_bandwidth,info.upper_bandwidth);
   string flags="";
   if((info.flags&MATRIX_UPPER)==MATRIX_UPPER)
      flags+="  MATRIX_UPPER";
   if((info.flags&MATRIX_LOWER)==MATRIX_LOWER)
      flags+="  MATRIX_LOWER";
   if((info.flags&MATRIX_UNITDIAG)==MATRIX_UNITDIAG)
      flags+="  MATRIX_UNITDIAG";
   if((info.flags&MATRIX_DIAGSCALAR)==MATRIX_DIAGSCALAR)
      flags+="  MATRIX_DIAGSCALAR";
   if((info.flags&MATRIX_QUASI_TRIANGULAR)==MATRIX_QUASI_TRIANGULAR)
      flags+="  MATRIX_QUASI_TRIANGULAR";
   if((info.flags&MATRIX_TRIANGLE_RIGHT_ALIGNED)==MATRIX_TRIANGLE_RIGHT_ALIGNED)
      flags+="  MATRIX_TRIANGLE_RIGHT_ALIGNED";
   if((info.flags&MATRIX_TRIANGLE_BOTTOM_ALIGNED)==MATRIX_TRIANGLE_BOTTOM_ALIGNED)
      flags+="  MATRIX_TRIANGLE_BOTTOM_ALIGNED";
   Print("info.flags :",flags);
 
 
   /*
   5940HSBLASTYPE_HSTYPE_MATRIX0x0011rows=10cols=10lower_bandwidth=1upper_bandwidth=-1
   info.flags :  MATRIX_UPPER  MATRIX_QUASI_TRIANGULAR
   */