MatrixInfo

Die Methode analysiert den Matrixinhalt, bestimmt den Strukturtyp der Matrix (symmetrisch, hermitesch, dreieckig, bandförmig usw.) und füllt die Struktur MqlMatrixInfo.

bool matrix::MatrixInfo(
  MqlMatrixInfo&  info      // Matrixinformationen
   );

Parameter

info

[out]  Ein Objekt des Typs MqlMatrixInfo, in dem die Matrixinformationen abgelegt werden.

Rückgabewert

Gibt true zurück, wenn die Matrix initialisiert ist und eine Größe ungleich null hat. Andernfalls wird false zurückgegeben.

Hinweis

Das Objekt der Struktur MqlMatrixInfo enthält mehr Informationen, als einzelne Methoden zur Matrixklassifizierung liefern können (IsSymmetric, IsHermitian, IsUpperTriangular usw.).

Struktur MqlMatrixInfo

struct MqlMatrixInfo
  {
    ushort            version,          // 5950
   char              signature[2],     // "GE", "SY", "HE", "TR", ...
   ENUM_BLAS_TYPE    matrix_class,     // BLASTYPE_GE, BLASTYPE_SY, BLASTYPE_HE usw. müssen zur Signatur passen
   ENUM_DATATYPE     data_type,        // TYPE_MATRIXD, TYPE_MATRIXF, TYPE_MATRIXCD, TYPE_MATRIXCF
    uint              flags,            // MATRIX_UPPER, MATRIX_LOWER, MATRIX_UNITDIAG, ...
    ulong             rows,             // Zeilen der Matrix
    ulong             cols,             // Spalten der Matrix
    ulong             nnz,              // Anzahl der Nicht-Null-Elemente
    long              lower_bandwidth,  // kl: Anzahl potenziell von null verschiedener Subdiagonalen
    long              upper_bandwidth,  // ku: Anzahl potenziell von null verschiedener Superdiagonalen
    ulong             data_size,        // Größe der folgenden Nutzdaten in Bytes
  };

Informationen aus der Struktur MqlMatrixInfo werden beim Schreiben einer Matrix in eine Datei und beim Lesen einer Matrix aus einer Datei verwendet. Der Wert data_size wird abhängig von der erkannten Matrixklasse berechnet und enthält die Anzahl der Bytes, die zum Speichern der Matrix erforderlich sind. Beispielsweise belegt eine allgemeine Matrix (GE) m * n * sizeof(type) Bytes. Eine allgemeine Bandmatrix (GB) belegt (kl+ku+1) * n * sizeof(type) Bytes. Eine symmetrische n-x-n-Matrix (SY) belegt n * (n+1)/2 * sizeof(type) Bytes.

ENUM_BLAS_TYPE

Eine Enumeration, die den Typ der erkannten Matrix enthält.

ID

Beschreibung

BLASTYPE_GE

'GE': allgemeine Matrix

BLASTYPE_BD      

'BD': bidiagonale Matrix

BLASTYPE_DI

'DI': diagonale Matrix

BLASTYPE_GB

'GB': allgemeine Bandmatrix

BLASTYPE_GT

'GT': allgemeine tridiagonale Matrix

BLASTYPE_HB

'HB': hermitesche Bandmatrix

BLASTYPE_HE

'HE': hermitesche Matrix

BLASTYPE_HT

'HT': hermitesche tridiagonale Matrix

BLASTYPE_HS

'HS': Hessenberg-Matrix

BLASTYPE_SB

'SB': symmetrische Bandmatrix

BLASTYPE_ST

'ST': symmetrische tridiagonale Matrix

BLASTYPE_SY

'SY': symmetrische Matrix

BLASTYPE_TB

'TB': dreieckige Bandmatrix

BLASTYPE_TR

'TR': Dreiecksmatrix

BLASTYPE_TZ

'TZ': Trapezmatrix

BLASTYPE_VE

'VE': Vektor - verwendet beim Schreiben und Lesen eines Vektors

BLASTYPE_CO

'CO': dünn besetztes COO - verwendet beim Schreiben und Lesen einer Matrix oder eines Vektors, wenn die Speicherung als dünn besetzte Struktur effizienter ist als die Speicherung als 'GE' oder 'VE'

Die Typen BLASTYPE_VE und BLASTYPE_CO werden von der Methode MatrixInfo nie zurückgegeben. Die Namen der übrigen Enumerationswerte entsprechen den in LAPACK verwendeten Abkürzungen zur Bezeichnung verschiedener Matrixklassen. Der Typ HT ist eine Ausnahme: hermitesch tridiagonal. HT kommt in der Standardterminologie von LAPACK nicht vor und wird in Analogie zu ST (symmetrisch tridiagonal) eingeführt, um eine hermitesche tridiagonale Matrix zu bezeichnen; dies ermöglicht ebenfalls eine kompakte Speicherung der entsprechenden Matrix.

MqlMatrixInfo::flags

Flags, die den erkannten Matrixtyp genauer bestimmen.

ID

Wert

Beschreibung

MATRIX_UPPER

0x0001

oberer Teil oberhalb der Hauptdiagonale

MATRIX_LOWER      

0x0002

unterer Teil unterhalb der Hauptdiagonale

MATRIX_UNITDIAG

0x0004

die Hauptdiagonale enthält nur Einsen (1)

MATRIX_DIAGSCALAR

0x0008

die Hauptdiagonale enthält gleiche Werte

MATRIX_QUASI_TRIANGULAR

0x0010

mögliche quasi-dreieckige Matrix

MATRIX_TRIANGLE_RIGHT_ALIGNED

0x0020

oberer dreieckiger Teil ist am rechten Rand einer breiten Matrix ausgerichtet

MATRIX_TRIANGLE_BOTTOM_ALIGNED

0x0040

unterer dreieckiger Teil ist am unteren Rand einer hohen Matrix ausgerichtet

Die aufgeführten Flags (außer MATRIX_QUASI_TRIANGULAR) ermöglichen eine kompaktere Speicherung von Matrizen.

 

Beispiel

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