testcase_cmatrix.cpp

来自「c++ 实现的矩阵运算库」· C++ 代码 · 共 2,500 行 · 第 1/5 页

CPP
2,500
字号
  CPPUNIT_ASSERT( A.data[1][2] == 0 );
  CPPUNIT_ASSERT( A.data[2][2] == 0 );
  CPPUNIT_ASSERT( A.data[3][2] == 0 );

  CPPUNIT_ASSERT( A.data[0][3] == 0 );
  CPPUNIT_ASSERT( A.data[1][3] == 0 );
  CPPUNIT_ASSERT( A.data[2][3] == 0 );
  CPPUNIT_ASSERT( A.data[3][3] == 0 );


  result = MTX_Zero(&A);
  result = MTX_InsertSubMatrix( &A, &B, 2, 2 );
  CPPUNIT_ASSERT( result );
  CPPUNIT_ASSERT( A.data[0][0] == 0 );
  CPPUNIT_ASSERT( A.data[1][0] == 0 );
  CPPUNIT_ASSERT( A.data[2][0] == 0 );
  CPPUNIT_ASSERT( A.data[3][0] == 0 );
  
  CPPUNIT_ASSERT( A.data[0][1] == 0 );
  CPPUNIT_ASSERT( A.data[1][1] == 0 );
  CPPUNIT_ASSERT( A.data[2][1] == 0 );
  CPPUNIT_ASSERT( A.data[3][1] == 0 );

  CPPUNIT_ASSERT( A.data[0][2] == 0 );
  CPPUNIT_ASSERT( A.data[1][2] == 0 );
  CPPUNIT_ASSERT( A.data[2][2] == 1 );
  CPPUNIT_ASSERT( A.data[3][2] == 2 );

  CPPUNIT_ASSERT( A.data[0][3] == 0 );
  CPPUNIT_ASSERT( A.data[1][3] == 0 );
  CPPUNIT_ASSERT( A.data[2][3] == 3 );
  CPPUNIT_ASSERT( A.data[3][3] == 4 );

  result = MTX_InsertSubMatrix( &A, &B, 3, 2 );
  CPPUNIT_ASSERT( result == false );

  result = MTX_InsertSubMatrix( &A, &B, 2, 3 );
  CPPUNIT_ASSERT( result == false );
  
  result = MTX_Free( &A );
  CPPUNIT_ASSERT( result );
  result = MTX_Free( &B );
  CPPUNIT_ASSERT( result );


  // complex case
  result = MTX_Calloc( &A, nrows, ncols, false );
  CPPUNIT_ASSERT( result );
  result = MTX_Calloc( &B, 2, 2, false );
  CPPUNIT_ASSERT( result );

  B.cplx[0][0].re = 1;
  B.cplx[1][0].re = 2;
  B.cplx[0][1].re = 3;
  B.cplx[1][1].re = 4;  
  
  result = MTX_InsertSubMatrix( &A, &B, 1, 1 );
  CPPUNIT_ASSERT( result );
  CPPUNIT_ASSERT( A.cplx[0][0].re == 0 );
  CPPUNIT_ASSERT( A.cplx[1][0].re == 0 );
  CPPUNIT_ASSERT( A.cplx[2][0].re == 0 );
  CPPUNIT_ASSERT( A.cplx[3][0].re == 0 );
  
  CPPUNIT_ASSERT( A.cplx[0][1].re == 0 );
  CPPUNIT_ASSERT( A.cplx[1][1].re == 1 );
  CPPUNIT_ASSERT( A.cplx[2][1].re == 2 );
  CPPUNIT_ASSERT( A.cplx[3][1].re == 0 );

  CPPUNIT_ASSERT( A.cplx[0][2].re == 0 );
  CPPUNIT_ASSERT( A.cplx[1][2].re == 3 );
  CPPUNIT_ASSERT( A.cplx[2][2].re == 4 );
  CPPUNIT_ASSERT( A.cplx[3][2].re == 0 );

  CPPUNIT_ASSERT( A.cplx[0][3].re == 0 );
  CPPUNIT_ASSERT( A.cplx[1][3].re == 0 );
  CPPUNIT_ASSERT( A.cplx[2][3].re == 0 );
  CPPUNIT_ASSERT( A.cplx[3][3].re == 0 );
  
  result = MTX_Free( &A );
  CPPUNIT_ASSERT( result );
  result = MTX_Free( &B );
  CPPUNIT_ASSERT( result );

  // mixed case, inserting real into a complex matrix
  result = MTX_Calloc( &A, nrows, ncols, false );
  CPPUNIT_ASSERT( result );
  result = MTX_Calloc( &B, 2, 2, true );
  CPPUNIT_ASSERT( result );

  B.data[0][0] = 1;
  B.data[1][0] = 2;
  B.data[0][1] = 3;
  B.data[1][1] = 4;  
  
  result = MTX_InsertSubMatrix( &A, &B, 1, 1 );
  CPPUNIT_ASSERT( result );
  CPPUNIT_ASSERT( A.cplx[0][0].re == 0 );
  CPPUNIT_ASSERT( A.cplx[1][0].re == 0 );
  CPPUNIT_ASSERT( A.cplx[2][0].re == 0 );
  CPPUNIT_ASSERT( A.cplx[3][0].re == 0 );
  
  CPPUNIT_ASSERT( A.cplx[0][1].re == 0 );
  CPPUNIT_ASSERT( A.cplx[1][1].re == 1 );
  CPPUNIT_ASSERT( A.cplx[2][1].re == 2 );
  CPPUNIT_ASSERT( A.cplx[3][1].re == 0 );

  CPPUNIT_ASSERT( A.cplx[0][2].re == 0 );
  CPPUNIT_ASSERT( A.cplx[1][2].re == 3 );
  CPPUNIT_ASSERT( A.cplx[2][2].re == 4 );
  CPPUNIT_ASSERT( A.cplx[3][2].re == 0 );

  CPPUNIT_ASSERT( A.cplx[0][3].re == 0 );
  CPPUNIT_ASSERT( A.cplx[1][3].re == 0 );
  CPPUNIT_ASSERT( A.cplx[2][3].re == 0 );
  CPPUNIT_ASSERT( A.cplx[3][3].re == 0 );
  
  result = MTX_Free( &A );
  CPPUNIT_ASSERT( result );
  result = MTX_Free( &B );
  CPPUNIT_ASSERT( result );

  // mixed case, inserting complex data into a real matrix that must then become complex
  result = MTX_Calloc( &A, nrows, ncols, true );
  CPPUNIT_ASSERT( result );
  result = MTX_Calloc( &B, 2, 2, false );
  CPPUNIT_ASSERT( result );

  B.cplx[0][0].re = 1;
  B.cplx[1][0].re = 2;
  B.cplx[0][1].re = 3;
  B.cplx[1][1].re = 4;  
  
  result = MTX_InsertSubMatrix( &A, &B, 1, 1 );
  CPPUNIT_ASSERT( result );
  CPPUNIT_ASSERT( !A.isReal );
  CPPUNIT_ASSERT( A.cplx[0][0].re == 0 );
  CPPUNIT_ASSERT( A.cplx[1][0].re == 0 );
  CPPUNIT_ASSERT( A.cplx[2][0].re == 0 );
  CPPUNIT_ASSERT( A.cplx[3][0].re == 0 );
  
  CPPUNIT_ASSERT( A.cplx[0][1].re == 0 );
  CPPUNIT_ASSERT( A.cplx[1][1].re == 1 );
  CPPUNIT_ASSERT( A.cplx[2][1].re == 2 );
  CPPUNIT_ASSERT( A.cplx[3][1].re == 0 );

  CPPUNIT_ASSERT( A.cplx[0][2].re == 0 );
  CPPUNIT_ASSERT( A.cplx[1][2].re == 3 );
  CPPUNIT_ASSERT( A.cplx[2][2].re == 4 );
  CPPUNIT_ASSERT( A.cplx[3][2].re == 0 );

  CPPUNIT_ASSERT( A.cplx[0][3].re == 0 );
  CPPUNIT_ASSERT( A.cplx[1][3].re == 0 );
  CPPUNIT_ASSERT( A.cplx[2][3].re == 0 );
  CPPUNIT_ASSERT( A.cplx[3][3].re == 0 );
  
  result = MTX_Free( &A );
  CPPUNIT_ASSERT( result );
  result = MTX_Free( &B );
  CPPUNIT_ASSERT( result );

  CMTX_TIMING_END();
}

void TestCase_cmatrix::Test_MTX_ExtractSubMatrix()
{
  CMTX_TIMING_START();
  MTX A;
  MTX B;
  BOOL result;

  result = MTX_Init( &A );
  CPPUNIT_ASSERT( result );
  result = MTX_Init( &B );
  CPPUNIT_ASSERT( result );  
  
  result = MTX_SetFromMatrixString( &A, "[1 2 3; 4 5 6; 7 8 9]" );
  CPPUNIT_ASSERT( result );  
  
  result = MTX_ExtractSubMatrix( &A, &B, 1, 0, 2, 2 );
  CPPUNIT_ASSERT( result );  

  CPPUNIT_ASSERT( B.nrows == 2 );
  CPPUNIT_ASSERT( B.ncols == 3 );
  CPPUNIT_ASSERT( B.data[0][0] == 4 );
  CPPUNIT_ASSERT( B.data[1][0] == 5 );
  CPPUNIT_ASSERT( B.data[2][0] == 6 );
  CPPUNIT_ASSERT( B.data[0][1] == 7 );
  CPPUNIT_ASSERT( B.data[1][1] == 8 );
  CPPUNIT_ASSERT( B.data[2][1] == 9 );

  result = MTX_ExtractSubMatrix( &A, &B, 1, 1, 1, 1 );
  CPPUNIT_ASSERT( result );  

  CPPUNIT_ASSERT( B.nrows == 1 );
  CPPUNIT_ASSERT( B.ncols == 1 );
  CPPUNIT_ASSERT( B.data[0][0] == 5 );

  result = MTX_ExtractSubMatrix( &A, &B, 0, 0, 0, 0 );
  CPPUNIT_ASSERT( result );  

  CPPUNIT_ASSERT( B.nrows == 1 );
  CPPUNIT_ASSERT( B.ncols == 1 );
  CPPUNIT_ASSERT( B.data[0][0] == 1 );

  result = MTX_ExtractSubMatrix( &A, &B, 0, 0, 2, 2 );
  CPPUNIT_ASSERT( result );  

  CPPUNIT_ASSERT( B.nrows == 3 );
  CPPUNIT_ASSERT( B.ncols == 3 );
  CPPUNIT_ASSERT( B.data[0][0] == 1 );
  CPPUNIT_ASSERT( B.data[1][0] == 2 );
  CPPUNIT_ASSERT( B.data[2][0] == 3 );  
  CPPUNIT_ASSERT( B.data[0][1] == 4 );
  CPPUNIT_ASSERT( B.data[1][1] == 5 );
  CPPUNIT_ASSERT( B.data[2][1] == 6 );
  CPPUNIT_ASSERT( B.data[0][2] == 7 );
  CPPUNIT_ASSERT( B.data[1][2] == 8 );
  CPPUNIT_ASSERT( B.data[2][2] == 9 );

  result = MTX_ExtractSubMatrix( &A, &B, 3, 3, 2, 2 );
  CPPUNIT_ASSERT( !result );  

  result = MTX_ExtractSubMatrix( &A, &B, 2, 2, 3, 3 );
  CPPUNIT_ASSERT( !result );  
    
  result = MTX_Free( &A );
  CPPUNIT_ASSERT( result );
  result = MTX_Free( &B );
  CPPUNIT_ASSERT( result );

  CMTX_TIMING_END();
}




void TestCase_cmatrix::Test_MTX_Zero()
{ 
  CMTX_TIMING_START();
  unsigned nrows = 2;
  unsigned ncols = 2; 
  MTX M;
  BOOL result;

  result = MTX_Init( &M );
  CPPUNIT_ASSERT( result );
  result = MTX_Calloc( &M, nrows, ncols, true );
  CPPUNIT_ASSERT( result );

  M.data[0][0] = 10;
  M.data[1][0] = 20;
  M.data[0][1] = 30;
  M.data[1][1] = 40;

  result = MTX_Zero( &M );
  CPPUNIT_ASSERT( result );  
  CPPUNIT_ASSERT( M.data[0][0] == 0 );
  CPPUNIT_ASSERT( M.data[1][0] == 0 );
  CPPUNIT_ASSERT( M.data[0][1] == 0 );
  CPPUNIT_ASSERT( M.data[1][1] == 0 );

  result = MTX_Free( &M );
  CPPUNIT_ASSERT( result );

  // complex case
  result = MTX_Calloc( &M, nrows, ncols, false );
  CPPUNIT_ASSERT( result );

  M.cplx[0][0].re = 10;
  M.cplx[1][0].im = 20;
  M.cplx[0][1].re = 30;
  M.cplx[1][1].im = 40;

  result = MTX_Zero( &M );
  CPPUNIT_ASSERT( result );  
  CPPUNIT_ASSERT( M.cplx[0][0].re == 0 );
  CPPUNIT_ASSERT( M.cplx[1][0].im == 0 );
  CPPUNIT_ASSERT( M.cplx[0][1].re == 0 );
  CPPUNIT_ASSERT( M.cplx[1][1].im == 0 );

  result = MTX_Free( &M );
  CPPUNIT_ASSERT( result );
  CMTX_TIMING_END();
}

    

void TestCase_cmatrix::Test_MTX_ZeroColumn()
{ 
  CMTX_TIMING_START();
  unsigned nrows = 2;
  unsigned ncols = 2; 
  MTX M;
  BOOL result;

  result = MTX_Init( &M );
  CPPUNIT_ASSERT( result );
  result = MTX_Calloc( &M, nrows, ncols, true );
  CPPUNIT_ASSERT( result );

  M.data[0][0] = 10;
  M.data[1][0] = 20;
  M.data[0][1] = 30;
  M.data[1][1] = 40;

  result = MTX_ZeroColumn( &M, 1 );
  CPPUNIT_ASSERT( result );  
  CPPUNIT_ASSERT( M.data[0][0] == 10 );
  CPPUNIT_ASSERT( M.data[1][0] == 0 );
  CPPUNIT_ASSERT( M.data[0][1] == 30 );
  CPPUNIT_ASSERT( M.data[1][1] == 0 );

  result = MTX_Free( &M );
  CPPUNIT_ASSERT( result );

  // complex case
  result = MTX_Calloc( &M, nrows, ncols, false );
  CPPUNIT_ASSERT( result );

  M.cplx[0][0].re = 10;
  M.cplx[1][0].im = 20;
  M.cplx[0][1].re = 30;
  M.cplx[1][1].im = 40;

  result = MTX_ZeroColumn( &M, 1 );
  CPPUNIT_ASSERT( result );  
  CPPUNIT_ASSERT( M.cplx[0][0].re == 10 );
  CPPUNIT_ASSERT( M.cplx[1][0].im == 0 );
  CPPUNIT_ASSERT( M.cplx[0][1].re == 30 );
  CPPUNIT_ASSERT( M.cplx[1][1].im == 0 );

  result = MTX_Free( &M );
  CPPUNIT_ASSERT( result );
  CMTX_TIMING_END();
}


void TestCase_cmatrix::Test_MTX_ZeroRow()
{ 
  CMTX_TIMING_START();
  unsigned nrows = 2;
  unsigned ncols = 2; 
  MTX M;
  BOOL result;

  result = MTX_Init( &M );
  CPPUNIT_ASSERT( result );
  result = MTX_Calloc( &M, nrows, ncols, true );
  CPPUNIT_ASSERT( result );

  M.data[0][0] = 10;
  M.data[1][0] = 20;
  M.data[0][1] = 30;
  M.data[1][1] = 40;

  result = MTX_ZeroRow( &M, 0 );
  CPPUNIT_ASSERT( result );  
  CPPUNIT_ASSERT( M.data[0][0] == 0 );
  CPPUNIT_ASSERT( M.data[1][0] == 0 );
  CPPUNIT_ASSERT( M.data[0][1] == 30 );
  CPPUNIT_ASSERT( M.data[1][1] == 40 );

  // complex case
  result = MTX_Calloc( &M, nrows, ncols, false );
  CPPUNIT_ASSERT( result );
  CPPUNIT_ASSERT( !M.isReal );

  M.cplx[0][0].re = 10;
  M.cplx[1][0].im = 20;
  M.cplx[0][1].re = 30;
  M.cplx[1][1].im = 40;

  result = MTX_ZeroRow( &M, 1 );
  CPPUNIT_ASSERT( result );  
  CPPUNIT_ASSERT( M.cplx[0][0].re == 10 );
  CPPUNIT_ASSERT( M.cplx[1][0].im == 20 );
  CPPUNIT_ASSERT( M.cplx[0][1].re == 0 );
  CPPUNIT_ASSERT( M.cplx[1][1].im == 0 );

  result = MTX_Free( &M );
  CPPUNIT_ASSERT( result );
  CMTX_TIMING_END();
}


void TestCase_cmatrix::Test_MTX_Fill()
{ 
  CMTX_TIMING_START();
  unsigned nrows = 2;
  unsigned ncols = 2; 
  MTX M;
  BOOL result;
  stComplex cplxval;

  result = MTX_Init( &M );
  CPPUNIT_ASSERT( result );
  result = MTX_Calloc( &M, nrows, ncols, true );
  CPPUNIT_ASSERT( result );

  result = MTX_Fill( &M, 11 );
  CPPUNIT_ASSERT( result );  
  CPPUNIT_ASSERT( M.data[0][0] == 11 );
  CPPUNIT_ASSERT( M.data[1][0] == 11 );
  CPPUNIT_ASSERT( M.data[0][1] == 11 );
  CPPUNIT_ASSERT( M.data[1][1] == 11 );

  // complex case
  cplxval.re = 11;
  cplxval.im = 2;
  result = MTX_FillComplex( &M, cplxval.re, cplxval.im );
  CPPUNIT_ASSERT( result );  
  CPPUNIT_ASSERT( !M.isReal );
  CPPUNIT_ASSERT( M.cplx[0][0].re == 11 );
  CPPUNIT_ASSERT( M.cplx[0][0].im == 2 );
  CPPUNIT_ASSERT( M.cplx[1][0].re == 11 );
  CPPUNIT_ASSERT( M.cplx[1][0].im == 2 );
  CPPUNIT_ASSERT( M.cplx[0][1].re == 11 );
  CPPUNIT_ASSERT( M.cplx[0][1].im == 2 );
  CPPUNIT_ASSERT( M.cplx[1][1].re == 11 );
  CPPUNIT_ASSERT( M.cplx[1][1].im == 2 );

  result = MTX_Free( &M );
  CPPUNIT_ASSERT( result );
  CMTX_TIMING_END();
}


    
void TestCase_cmatrix::Test_MTX_FillColumn()
{ 
  CMTX_TIMING_START();
  unsigned nrows = 2;
  unsigned ncols = 2; 
  MTX M;
  BOOL result;
  stComplex cplxval;

  result = MTX_Init( &M );
  CPPUNIT_ASSERT( result );
  result = MTX_Calloc( &M, nrows, ncols, true );
  CPPUNIT_ASSERT( result );

  result = MTX_FillColumn( &M, 1, 11 );
  CPPUNIT_ASSERT( result );  
  CPPUNIT_ASSERT( M.data[0][0] == 0 );
  CPPUNIT_ASSERT( M.data[1][0] == 11 );
  CPPUNIT_ASSERT( M.data[0][1] == 0 );
  CPPUNIT_ASSERT( M.data[1][1] == 11 );

  // complex case
  cplxval.re = 11;
  cplxval.im = 2;
  result = MTX_FillColumnComplex( &M, 1, cplxval.re, cplxval.im );
  CPPUNIT_ASSERT( result );  
  CPPUNIT_ASSERT( !M.isReal );  
  CPPUNIT_ASSERT( M.cplx[0][0].re == 0 );
  CPPUNIT_ASSERT( M.cplx[0][0].im == 0 );
  CPPUNIT_ASSERT( M.cplx[1][0].re == 11 );
  CPPUNIT_ASSERT( M.cplx[1][0].im == 2 );
  CPPUNIT_ASSERT( M.cplx[0][1].re == 0 );
  CPPUNIT_ASSERT( M.cplx[0][1].im == 0 );
  CPPUNIT_ASSERT( M.cplx[1][1].re == 11 );
  CPPUNIT_ASSERT( M.cplx[1][1].im == 2 );

  result = MTX_Free( &M );
  CPPUNIT_ASSERT( result );
  CMTX_TIMING_END();
}


void TestCase_cmatrix::Test_MTX_FillRow()
{ 
  CMTX_TIMING_START();
  unsigned nrows = 2;
  unsigned ncols = 2; 
  MTX M;
  BOOL result;
  stComplex cplxval;

  result = MTX_Init( &M );
  CPPUNIT_ASSERT( result );
  result = MTX_Calloc( &M, nrows, ncols, true );
  CPPUNIT_ASSERT( result );

  result = MTX_FillRow( &M, 1, 11 );
  CPPUNIT_ASSERT( result );  
  CPPUNIT_ASSERT( M.data[0][0] == 0 );
  CPPUNIT_ASSERT( M.data[1][0] == 0 );
  CPPUNIT_ASSERT( M.data[0][1] == 11 );
  CPPUNIT_ASSERT( M.data[1][1] == 11 );

  // complex case
  cplxval.re = 11;
  cplxval.im = 2;
  result = MTX_FillRowComplex( &M, 1, cplxval.re, cplxval.im );
  CPPUNIT_ASSERT( result );  
  CPPUNIT_ASSERT( M.cplx[0][0].re == 0 );
  CPPUNIT_ASSERT( M.cplx[0][0].im == 0 );
  CPPUNIT_ASSERT( M.cplx[1][0].re == 0 );
  CPPUNIT_ASSERT( M.

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?