MatrixInfo

Il metodo analizza il contenuto della matrice, ne determina il tipo strutturale (simmetrica, hermitiana, triangolare, a banda e così via) e riempie la struttura MqlMatrixInfo.

bool matrix::MatrixInfo(
  MqlMatrixInfo&  info      // informazioni sulla matrice
   );

Parametri

info

[out]  Un oggetto del tipo MqlMatrixInfo in cui vengono inserite le informazioni sulla matrice.

Valore restituito

Restituisce true se la matrice è inizializzata e ha dimensione diversa da zero. In caso contrario restituisce false.

Nota

L’oggetto della struttura MqlMatrixInfo contiene più informazioni di quante possano fornire i singoli metodi di classificazione delle matrici (IsSymmetric, IsHermitian, IsUpperTriangular e così via).

Struttura MqlMatrixInfo

struct MqlMatrixInfo
  {
    ushort            version,          // 5950
   char              signature[2],     // "GE", "SY", "HE", "TR", ...
   ENUM_BLAS_TYPE    matrix_class,     // BLASTYPE_GE, BLASTYPE_SY, BLASTYPE_HE ecc. devono corrispondere alla signature
   ENUM_DATATYPE     data_type,        // TYPE_MATRIXD, TYPE_MATRIXF, TYPE_MATRIXCD, TYPE_MATRIXCF
    uint              flags,            // MATRIX_UPPER, MATRIX_LOWER, MATRIX_UNITDIAG, ...
    ulong             rows,             // righe della matrice
    ulong             cols,             // colonne della matrice
    ulong             nnz,              // numero di elementi non nulli
    long              lower_bandwidth,  // kl: numero di sottodiagonali potenzialmente non nulle
    long              upper_bandwidth,  // ku: numero di sovradiagonali potenzialmente non nulle
    ulong             data_size,        // dimensione dei dati seguenti in byte
  };

Le informazioni della struttura MqlMatrixInfo vengono utilizzate durante la scrittura di una matrice in un file e durante la lettura di una matrice da un file. Il valore data_size viene calcolato in base alla classe di matrice riconosciuta e contiene il numero di byte necessari per memorizzare la matrice. Ad esempio, una matrice generale (GE) occupa m * n * sizeof(type) byte. Una matrice generale a banda (GB) occupa (kl+ku+1) * n * sizeof(type) byte. Una matrice simmetrica n x n (SY) occupa n * (n+1)/2 * sizeof(type) byte.

ENUM_BLAS_TYPE

Enumerazione contenente il tipo della matrice riconosciuta.

ID

Descrizione

BLASTYPE_GE

'GE': matrice generale

BLASTYPE_BD      

'BD': matrice bidiagonale

BLASTYPE_DI

'DI': matrice diagonale

BLASTYPE_GB

'GB': matrice generale a banda

BLASTYPE_GT

'GT': matrice tridiagonale generale

BLASTYPE_HB

'HB': matrice hermitiana a banda

BLASTYPE_HE

'HE': matrice hermitiana

BLASTYPE_HT

'HT': matrice tridiagonale hermitiana

BLASTYPE_HS

'HS': matrice di Hessenberg

BLASTYPE_SB

'SB': matrice simmetrica a banda

BLASTYPE_ST

'ST': matrice tridiagonale simmetrica

BLASTYPE_SY

'SY': matrice simmetrica

BLASTYPE_TB

'TB': matrice triangolare a banda

BLASTYPE_TR

'TR': matrice triangolare

BLASTYPE_TZ

'TZ': matrice trapezoidale

BLASTYPE_VE

'VE': vettore - usato durante la scrittura e la lettura di un vettore

BLASTYPE_CO

'CO': COO sparsa - usata durante la scrittura e la lettura di una matrice o di un vettore, se memorizzarlo come sparso è più efficiente che memorizzarlo come 'GE' o 'VE'

I tipi BLASTYPE_VE e BLASTYPE_CO non vengono mai restituiti dal metodo MatrixInfo. I nomi degli altri elementi dell’enumerazione corrispondono alle abbreviazioni usate in LAPACK per indicare varie classi di matrici. Il tipo HT è un’eccezione: tridiagonale hermitiana. HT non è presente nella terminologia standard di LAPACK ed è introdotto per analogia con ST (tridiagonale simmetrica) per indicare una matrice tridiagonale hermitiana, consentendo anche di memorizzare la matrice corrispondente in modo compatto.

MqlMatrixInfo::flags

Flag che precisano il tipo di matrice riconosciuto.

ID

Valore

Descrizione

MATRIX_UPPER

0x0001

parte superiore sopra la diagonale principale

MATRIX_LOWER      

0x0002

parte inferiore sotto la diagonale principale

MATRIX_UNITDIAG

0x0004

la diagonale principale contiene solo uno (1)

MATRIX_DIAGSCALAR

0x0008

la diagonale principale contiene gli stessi valori

MATRIX_QUASI_TRIANGULAR

0x0010

possibile matrice quasi triangolare

MATRIX_TRIANGLE_RIGHT_ALIGNED

0x0020

parte triangolare superiore allineata al bordo destro di una matrice larga

MATRIX_TRIANGLE_BOTTOM_ALIGNED

0x0040

parte triangolare inferiore allineata al bordo inferiore di una matrice alta

I flag elencati (eccetto MATRIX_QUASI_TRIANGULAR) consentono di memorizzare le matrici in modo più compatto.

 

Esempio

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