MatrixInfo

O método analisa o conteúdo da matriz, determina seu tipo estrutural (simétrica, hermitiana, triangular, em banda e assim por diante) e preenche a estrutura MqlMatrixInfo.

bool matrix::MatrixInfo(
  MqlMatrixInfo&  info      // informações da matriz
   );

Parâmetros

info

[out]  Um objeto do tipo MqlMatrixInfo no qual são colocadas as informações da matriz.

Valor de retorno

Retorna true se a matriz estiver inicializada e tiver tamanho diferente de zero. Caso contrário, retorna false.

Observação

O objeto da estrutura MqlMatrixInfo contém mais informações do que os métodos individuais de classificação de matrizes podem fornecer (IsSymmetric, IsHermitian, IsUpperTriangular e assim por diante).

Estrutura 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. devem corresponder à assinatura
   ENUM_DATATYPE     data_type,        // TYPE_MATRIXD, TYPE_MATRIXF, TYPE_MATRIXCD, TYPE_MATRIXCF
    uint              flags,            // MATRIX_UPPER, MATRIX_LOWER, MATRIX_UNITDIAG, ...
    ulong             rows,             // linhas da matriz
    ulong             cols,             // colunas da matriz
    ulong             nnz,              // número de elementos não nulos
    long              lower_bandwidth,  // kl: número de subdiagonais potencialmente não nulas
    long              upper_bandwidth,  // ku: número de superdiagonais potencialmente não nulas
    ulong             data_size,        // tamanho dos dados seguintes em bytes
  };

As informações da estrutura MqlMatrixInfo são usadas ao gravar uma matriz em um arquivo e ao ler uma matriz de um arquivo. O valor data_size é calculado de acordo com a classe de matriz reconhecida e contém o número de bytes necessários para armazenar a matriz. Por exemplo, uma matriz geral (GE) ocupa m * n * sizeof(type) bytes. Uma matriz geral em banda (GB) ocupa (kl+ku+1) * n * sizeof(type) bytes. Uma matriz simétrica n x n (SY) ocupa n * (n+1)/2 * sizeof(type) bytes.

ENUM_BLAS_TYPE

Enumeração que contém o tipo da matriz reconhecida.

ID

Descrição

BLASTYPE_GE

'GE': matriz geral

BLASTYPE_BD      

'BD': matriz bidiagonal

BLASTYPE_DI

'DI': matriz diagonal

BLASTYPE_GB

'GB': matriz geral em banda

BLASTYPE_GT

'GT': matriz tridiagonal geral

BLASTYPE_HB

'HB': matriz hermitiana em banda

BLASTYPE_HE

'HE': matriz hermitiana

BLASTYPE_HT

'HT': matriz tridiagonal hermitiana

BLASTYPE_HS

'HS': matriz de Hessenberg

BLASTYPE_SB

'SB': matriz simétrica em banda

BLASTYPE_ST

'ST': matriz tridiagonal simétrica

BLASTYPE_SY

'SY': matriz simétrica

BLASTYPE_TB

'TB': matriz triangular em banda

BLASTYPE_TR

'TR': matriz triangular

BLASTYPE_TZ

'TZ': matriz trapezoidal

BLASTYPE_VE

'VE': vetor - usado ao gravar e ler um vetor

BLASTYPE_CO

'CO': COO esparsa - usada ao gravar e ler uma matriz ou vetor, se armazená-lo como esparso for mais eficiente do que armazená-lo como 'GE' ou 'VE'

Os tipos BLASTYPE_VE e BLASTYPE_CO nunca são retornados pelo método MatrixInfo. Os nomes dos demais itens da enumeração correspondem às abreviações usadas no LAPACK para indicar várias classes de matrizes. O tipo HT é uma exceção: tridiagonal hermitiana. HT não está presente na terminologia padrão do LAPACK e é introduzido por analogia com ST (tridiagonal simétrica) para indicar uma matriz tridiagonal hermitiana, o que também permite armazenar a matriz correspondente de forma compacta.

MqlMatrixInfo::flags

Flags que refinam o tipo de matriz reconhecido.

ID

Valor

Descrição

MATRIX_UPPER

0x0001

parte superior acima da diagonal principal

MATRIX_LOWER      

0x0002

parte inferior abaixo da diagonal principal

MATRIX_UNITDIAG

0x0004

a diagonal principal contém apenas uns (1)

MATRIX_DIAGSCALAR

0x0008

a diagonal principal contém os mesmos valores

MATRIX_QUASI_TRIANGULAR

0x0010

possível matriz quase triangular

MATRIX_TRIANGLE_RIGHT_ALIGNED

0x0020

parte triangular superior alinhada à borda direita de uma matriz larga

MATRIX_TRIANGLE_BOTTOM_ALIGNED

0x0040

parte triangular inferior alinhada à borda inferior de uma matriz alta

Os flags listados (exceto MATRIX_QUASI_TRIANGULAR) permitem armazenar matrizes de forma mais compacta.

 

Exemplo

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