MatrixInfo

El método analiza el contenido de la matriz, determina su tipo estructural (simétrica, hermítica, triangular, de banda, etc.) y rellena la estructura MqlMatrixInfo.

bool matrix::MatrixInfo(
  MqlMatrixInfo&  info      // información de la matriz
   );

Parámetros

info

[out]  Un objeto del tipo MqlMatrixInfo donde se coloca la información de la matriz.

Valor devuelto

Devuelve true si la matriz está inicializada y tiene un tamaño distinto de cero. En caso contrario, devuelve false.

Nota

El objeto de la estructura MqlMatrixInfo contiene más información de la que pueden proporcionar los métodos individuales de clasificación de matrices (IsSymmetric, IsHermitian, IsUpperTriangular, etc.).

Estructura 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. deben coincidir con la firma
   ENUM_DATATYPE     data_type,        // TYPE_MATRIXD, TYPE_MATRIXF, TYPE_MATRIXCD, TYPE_MATRIXCF
    uint              flags,            // MATRIX_UPPER, MATRIX_LOWER, MATRIX_UNITDIAG, ...
    ulong             rows,             // filas de la matriz
    ulong             cols,             // columnas de la matriz
    ulong             nnz,              // número de elementos no nulos
    long              lower_bandwidth,  // kl: número de subdiagonales potencialmente no nulas
    long              upper_bandwidth,  // ku: número de superdiagonales potencialmente no nulas
    ulong             data_size,        // tamaño de los datos siguientes en bytes
  };

La información de la estructura MqlMatrixInfo se utiliza al escribir una matriz en un archivo y al leer una matriz desde un archivo. El valor data_size se calcula según la clase de matriz reconocida y contiene el número de bytes necesarios para almacenar la matriz. Por ejemplo, una matriz general (GE) ocupa m * n * sizeof(type) bytes. Una matriz general de banda (GB) ocupa (kl+ku+1) * n * sizeof(type) bytes. Una matriz simétrica n x n (SY) ocupa n * (n+1)/2 * sizeof(type) bytes.

ENUM_BLAS_TYPE

Enumeración que contiene el tipo de la matriz reconocida.

ID

Descripción

BLASTYPE_GE

'GE': matriz general

BLASTYPE_BD      

'BD': matriz bidiagonal

BLASTYPE_DI

'DI': matriz diagonal

BLASTYPE_GB

'GB': matriz general de banda

BLASTYPE_GT

'GT': matriz tridiagonal general

BLASTYPE_HB

'HB': matriz hermítica de banda

BLASTYPE_HE

'HE': matriz hermítica

BLASTYPE_HT

'HT': matriz tridiagonal hermítica

BLASTYPE_HS

'HS': matriz de Hessenberg

BLASTYPE_SB

'SB': matriz simétrica de banda

BLASTYPE_ST

'ST': matriz tridiagonal simétrica

BLASTYPE_SY

'SY': matriz simétrica

BLASTYPE_TB

'TB': matriz triangular de banda

BLASTYPE_TR

'TR': matriz triangular

BLASTYPE_TZ

'TZ': matriz trapezoidal

BLASTYPE_VE

'VE': vector - usado al escribir y al leer un vector

BLASTYPE_CO

'CO': COO dispersa - usada al escribir y al leer una matriz o un vector si almacenarlo como disperso resulta más eficiente que almacenarlo como 'GE' o 'VE'

Los tipos BLASTYPE_VE y BLASTYPE_CO nunca son devueltos por el método MatrixInfo. Los nombres de los demás elementos de la enumeración corresponden a las abreviaturas usadas en LAPACK para designar diversas clases de matrices. El tipo HT es una excepción: tridiagonal hermítica. HT no está presente en la terminología estándar de LAPACK y se introduce por analogía con ST (tridiagonal simétrica) para designar una matriz tridiagonal hermítica, lo que también permite almacenar la matriz correspondiente de forma compacta.

MqlMatrixInfo::flags

Flags que precisan el tipo de matriz reconocido.

ID

Valor

Descripción

MATRIX_UPPER

0x0001

parte superior por encima de la diagonal principal

MATRIX_LOWER      

0x0002

parte inferior por debajo de la diagonal principal

MATRIX_UNITDIAG

0x0004

la diagonal principal contiene solo unos (1)

MATRIX_DIAGSCALAR

0x0008

la diagonal principal contiene los mismos valores

MATRIX_QUASI_TRIANGULAR

0x0010

posible matriz cuasi triangular

MATRIX_TRIANGLE_RIGHT_ALIGNED

0x0020

parte triangular superior alineada con el límite derecho de una matriz ancha

MATRIX_TRIANGLE_BOTTOM_ALIGNED

0x0040

parte triangular inferior alineada con el límite inferior de una matriz alta

Los flags indicados (excepto MATRIX_QUASI_TRIANGULAR) permiten almacenar las matrices de forma más compacta.

 

Ejemplo

   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
   */