MatrixInfo

이 메서드는 행렬 내용을 분석하고 구조적 유형(대칭, 에르미트, 삼각, 대역 등)을 결정한 다음 MqlMatrixInfo 구조체를 채웁니다.

bool matrix::MatrixInfo(
  MqlMatrixInfo&  info      // 행렬 정보
   );

매개변수

info

[out]  행렬 정보가 저장되는 MqlMatrixInfo 타입의 객체입니다.

반환값

행렬이 초기화되어 있고 크기가 0이 아니면 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 등은 signature와 일치해야 합니다
   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,              // 0이 아닌 요소 수
    long              lower_bandwidth,  // kl: 0이 아닐 수 있는 하위 대각선 수
    long              upper_bandwidth,  // ku: 0이 아닐 수 있는 상위 대각선 수
    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'로 저장하는 것보다 희소 형식으로 저장하는 것이 더 효율적인 경우 사용됩니다

BLASTYPE_VE 및 BLASTYPE_CO 타입은 MatrixInfo 메서드에서 반환되지 않습니다. 나머지 열거형 항목의 이름은 LAPACK에서 다양한 행렬 클래스를 나타내는 데 사용되는 약어와 일치합니다. HT 타입은 예외입니다: 에르미트 삼중대각. HT는 표준 LAPACK 용어에는 없으며, 에르미트 삼중대각 행렬을 나타내기 위해 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
   */