MatrixInfo

该方法分析矩阵内容,确定其结构类型(对称、厄米、三角、带状等),并填充 MqlMatrixInfo 结构。

bool matrix::MatrixInfo(
  MqlMatrixInfo&  info      // 矩阵信息
   );

参数

info

[out]  一个 MqlMatrixInfo 类型的对象,用于存放矩阵信息。

返回值

如果矩阵已初始化且大小非零,则返回 true。否则返回 false。

注意

MqlMatrixInfo 结构对象包含的信息比单个矩阵分类方法能够提供的信息更多(IsSymmetric, IsHermitian, IsUpperTriangular 等)。

MqlMatrixInfo 结构

struct MqlMatrixInfo
  {
    ushort            version,          // 5950
   char              signature[2],     // "GE", "SY", "HE", "TR", ...
   ENUM_BLAS_TYPE    matrix_class,     // BLASTYPE_GE、BLASTYPE_SY、BLASTYPE_HE 等必须与签名匹配
   ENUM_DATATYPE     data_type,        // TYPE_MATRIXD, TYPE_MATRIXF, TYPE_MATRIXCD, TYPE_MATRIXCF
    uint              flags,            // MATRIX_UPPER, MATRIX_LOWER, MATRIX_UNITDIAG, ...
    ulong             rows,             // 矩阵行数
    ulong             cols,             // 矩阵列数
    ulong             nnz,              // 非零元素数量
    long              lower_bandwidth,  // kl: 可能非零的下对角线数量
    long              upper_bandwidth,  // ku: 可能非零的上对角线数量
    ulong             data_size,        // 后续数据的大小(字节)
  };

MqlMatrixInfo 结构中的信息用于写入矩阵到文件以及从文件读取矩阵。 data_size 值根据识别出的矩阵类别计算,包含存储矩阵所需的字节数。例如,通用矩阵 (GE) 占用 m * n * sizeof(type) 字节。通用带状矩阵 (GB) 占用 (kl+ku+1) * n * sizeof(type) 字节。n x n 对称矩阵 (SY) 占用 n * (n+1)/2 * sizeof(type) 字节。

ENUM_BLAS_TYPE

包含已识别矩阵类型的枚举。

ID

描述

BLASTYPE_GE

'GE': 通用矩阵

BLASTYPE_BD      

'BD': 双对角矩阵

BLASTYPE_DI

'DI': 对角矩阵

BLASTYPE_GB

'GB': 通用带状矩阵

BLASTYPE_GT

'GT': 通用三对角矩阵

BLASTYPE_HB

'HB': 厄米带状矩阵

BLASTYPE_HE

'HE': 厄米矩阵

BLASTYPE_HT

'HT': 厄米三对角矩阵

BLASTYPE_HS

'HS': Hessenberg 矩阵

BLASTYPE_SB

'SB': 对称带状矩阵

BLASTYPE_ST

'ST': 对称三对角矩阵

BLASTYPE_SY

'SY': 对称矩阵

BLASTYPE_TB

'TB': 三角带状矩阵

BLASTYPE_TR

'TR': 三角矩阵

BLASTYPE_TZ

'TZ': 梯形矩阵

BLASTYPE_VE

'VE': 向量 - 用于写入读取向量

BLASTYPE_CO

'CO': 稀疏 COO - 用于写入读取矩阵或向量,当以稀疏形式存储比以 'GE' 或 'VE' 存储更高效时使用

MatrixInfo 方法永远不会返回 BLASTYPE_VE 和 BLASTYPE_CO 类型。其余枚举项的名称对应于 LAPACK 中用于表示各种矩阵类别的缩写。HT 类型是一个例外:厄米三对角。标准 LAPACK 术语中没有 HT,它是参照 ST(对称三对角)引入的,用于表示厄米三对角矩阵,同时也允许相应矩阵以紧凑形式存储。

MqlMatrixInfo::flags

用于细化已识别矩阵类型的标志。

ID

描述

MATRIX_UPPER

0x0001

主对角线上方的上部

MATRIX_LOWER      

0x0002

主对角线下方的下部

MATRIX_UNITDIAG

0x0004

主对角线仅包含一 (1)

MATRIX_DIAGSCALAR

0x0008

主对角线包含相同的值

MATRIX_QUASI_TRIANGULAR

0x0010

可能的拟三角矩阵

MATRIX_TRIANGLE_RIGHT_ALIGNED

0x0020

上三角部分与宽矩阵的右边界对齐

MATRIX_TRIANGLE_BOTTOM_ALIGNED

0x0040

下三角部分与高矩阵的下边界对齐

列出的标志(除 MATRIX_QUASI_TRIANGULAR 外)允许以更紧凑的方式存储矩阵。

 

示例

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