MatrixInfo

La méthode analyse le contenu de la matrice, détermine son type structurel (symétrique, hermitienne, triangulaire, bande, etc.) et remplit la structure MqlMatrixInfo.

bool matrix::MatrixInfo(
  MqlMatrixInfo&  info      // informations de la matrice
   );

Paramètres

info

[out]  Un objet du type MqlMatrixInfo dans lequel les informations de la matrice sont placées.

Valeur de retour

Renvoie true si la matrice est initialisée et a une taille non nulle. Sinon, false est renvoyé.

Remarque

L’objet de la structure MqlMatrixInfo contient plus d’informations que les méthodes individuelles de classification des matrices ne peuvent en fournir (IsSymmetric, IsHermitian, IsUpperTriangular, etc.).

Structure MqlMatrixInfo

struct MqlMatrixInfo
  {
    ushort            version,          // 5950
   char              signature[2],     // "GE", "SY", "HE", "TR", ...
   ENUM_BLAS_TYPE    matrix_class,     // BLASTYPE_GE, BLASTYPE_SY, BLASTYPE_HE, etc. doivent correspondre à la signature
   ENUM_DATATYPE     data_type,        // TYPE_MATRIXD, TYPE_MATRIXF, TYPE_MATRIXCD, TYPE_MATRIXCF
    uint              flags,            // MATRIX_UPPER, MATRIX_LOWER, MATRIX_UNITDIAG, ...
    ulong             rows,             // lignes de la matrice
    ulong             cols,             // colonnes de la matrice
    ulong             nnz,              // nombre d’éléments non nuls
    long              lower_bandwidth,  // kl : nombre de sous-diagonales potentiellement non nulles
    long              upper_bandwidth,  // ku : nombre de surdiagonales potentiellement non nulles
    ulong             data_size,        // taille des données suivantes en octets
  };

Les informations de la structure MqlMatrixInfo sont utilisées lors de l’écriture d’une matrice dans un fichier et lors de la lecture d’une matrice depuis un fichier. La valeur data_size est calculée en fonction de la classe de matrice reconnue et contient le nombre d’octets nécessaires pour stocker la matrice. Par exemple, une matrice générale (GE) occupe m * n * sizeof(type) octets. Une matrice générale bande (GB) occupe (kl+ku+1) * n * sizeof(type) octets. Une matrice symétrique n x n (SY) occupe n * (n+1)/2 * sizeof(type) octets.

ENUM_BLAS_TYPE

Énumération contenant le type de la matrice reconnue.

ID

Description

BLASTYPE_GE

'GE' : matrice générale

BLASTYPE_BD      

'BD' : matrice bidiagonale

BLASTYPE_DI

'DI' : matrice diagonale

BLASTYPE_GB

'GB' : matrice générale bande

BLASTYPE_GT

'GT' : matrice tridiagonale générale

BLASTYPE_HB

'HB' : matrice hermitienne bande

BLASTYPE_HE

'HE' : matrice hermitienne

BLASTYPE_HT

'HT' : matrice tridiagonale hermitienne

BLASTYPE_HS

'HS' : matrice de Hessenberg

BLASTYPE_SB

'SB' : matrice symétrique bande

BLASTYPE_ST

'ST' : matrice tridiagonale symétrique

BLASTYPE_SY

'SY' : matrice symétrique

BLASTYPE_TB

'TB' : matrice triangulaire bande

BLASTYPE_TR

'TR' : matrice triangulaire

BLASTYPE_TZ

'TZ' : matrice trapézoïdale

BLASTYPE_VE

'VE' : vecteur - utilisé lors de l’écriture et de la lecture d’un vecteur

BLASTYPE_CO

'CO' : COO creuse - utilisée lors de l’écriture et de la lecture d’une matrice ou d’un vecteur si son stockage sous forme creuse est plus efficace que son stockage comme 'GE' ou 'VE'

Les types BLASTYPE_VE et BLASTYPE_CO ne sont jamais renvoyés par la méthode MatrixInfo. Les noms des autres éléments de l’énumération correspondent aux abréviations utilisées dans LAPACK pour désigner différentes classes de matrices. Le type HT est une exception : tridiagonal hermitien. HT n’existe pas dans la terminologie standard de LAPACK et est introduit par analogie avec ST (tridiagonal symétrique) pour désigner une matrice tridiagonale hermitienne, ce qui permet également de stocker la matrice correspondante de manière compacte.

MqlMatrixInfo::flags

Flags qui précisent le type de matrice reconnu.

ID

Valeur

Description

MATRIX_UPPER

0x0001

partie supérieure au-dessus de la diagonale principale

MATRIX_LOWER      

0x0002

partie inférieure sous la diagonale principale

MATRIX_UNITDIAG

0x0004

la diagonale principale ne contient que des uns (1)

MATRIX_DIAGSCALAR

0x0008

la diagonale principale contient les mêmes valeurs

MATRIX_QUASI_TRIANGULAR

0x0010

matrice quasi triangulaire possible

MATRIX_TRIANGLE_RIGHT_ALIGNED

0x0020

partie triangulaire supérieure alignée sur la limite droite d’une matrice large

MATRIX_TRIANGLE_BOTTOM_ALIGNED

0x0040

partie triangulaire inférieure alignée sur la limite inférieure d’une matrice haute

Les flags listés (sauf MATRIX_QUASI_TRIANGULAR) permettent de stocker les matrices plus compactement.

 

Exemple

   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, nnz=%I64u, lower_bandwidth=%I64d, upper_bandwidth=%I64d, data_size=%I64u",
               info.version,info.signature[0],info.signature[1],EnumToString(info.matrix_class),EnumToString(info.data_type),
               info.flags,info.rows,info.cols,info.nnz,info.lower_bandwidth,info.upper_bandwidth,info.data_size);
   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);
 
 
   /*
   5950HSBLASTYPE_HSTYPE_MATRIX0x0011rows=10cols=10nnz=57lower_bandwidth=1upper_bandwidth=-1data_size=512
   info.flags :  MATRIX_UPPER  MATRIX_QUASI_TRIANGULAR
   */