testcase_cmatrix.cpp

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

CPP
2,500
字号
  CPPUNIT_ASSERT( fabs( dif ) < 1e-12 );

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



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

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

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

  M.cplx[0][0].re = 1;
  M.cplx[0][0].im = 4;
  M.cplx[0][1].re = 2;
  M.cplx[0][1].im = 3;
  M.cplx[1][0].re = -3;
  M.cplx[1][0].im = -2;
  M.cplx[1][1].re = -4;
  M.cplx[1][1].im = -1;

  result = MTX_Conjugate( &M );
  CPPUNIT_ASSERT( result );
  CPPUNIT_ASSERT( !M.isReal );

  CPPUNIT_ASSERT_DOUBLES_EQUAL( M.cplx[0][0].re, 1.0, 1e-15 );
  CPPUNIT_ASSERT_DOUBLES_EQUAL( M.cplx[0][0].im, -4.0, 1e-15 );
  CPPUNIT_ASSERT_DOUBLES_EQUAL( M.cplx[0][1].re, 2.0, 1e-15 );
  CPPUNIT_ASSERT_DOUBLES_EQUAL( M.cplx[0][1].im, -3.0, 1e-15 );
  CPPUNIT_ASSERT_DOUBLES_EQUAL( M.cplx[1][0].re, -3.0, 1e-15 );
  CPPUNIT_ASSERT_DOUBLES_EQUAL( M.cplx[1][0].im, 2.0, 1e-15 );
  CPPUNIT_ASSERT_DOUBLES_EQUAL( M.cplx[1][1].re, -4.0, 1e-15 );
  CPPUNIT_ASSERT_DOUBLES_EQUAL( M.cplx[1][1].im, 1.0, 1e-15 );
  
  result = MTX_Free( &M );
  CPPUNIT_ASSERT( result );
  CMTX_TIMING_END();
}




void TestCase_cmatrix::Test_MTX_RemoveColumn()
{
  CMTX_TIMING_START();
  unsigned nrows = 1;
  unsigned ncols = 5; 
  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[2][0] = 30;
  M.data[3][0] = 40;
  M.data[4][0] = 50;

  result = MTX_RemoveColumn( &M, 0 );
  CPPUNIT_ASSERT( result );
  CPPUNIT_ASSERT( M.nrows == 1 && M.ncols == 4 );
  CPPUNIT_ASSERT( M.data[0][0] == 20.0 );
  CPPUNIT_ASSERT( M.data[1][0] == 30.0 );
  CPPUNIT_ASSERT( M.data[2][0] == 40.0 );
  CPPUNIT_ASSERT( M.data[3][0] == 50.0 );

  result = MTX_RemoveColumn( &M, 1 );
  CPPUNIT_ASSERT( result );
  CPPUNIT_ASSERT( M.nrows == 1 && M.ncols == 3 );
  CPPUNIT_ASSERT( M.data[0][0] == 20.0 );
  CPPUNIT_ASSERT( M.data[1][0] == 40.0 );
  CPPUNIT_ASSERT( M.data[2][0] == 50.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].re = 20;
  M.cplx[2][0].re = 30;
  M.cplx[3][0].re = 40;
  M.cplx[4][0].re = 50;

  result = MTX_RemoveColumn( &M, 0 );
  CPPUNIT_ASSERT( result );
  CPPUNIT_ASSERT( M.nrows == 1 && M.ncols == 4 );
  CPPUNIT_ASSERT( M.cplx[0][0].re == 20.0 );
  CPPUNIT_ASSERT( M.cplx[1][0].re == 30.0 );
  CPPUNIT_ASSERT( M.cplx[2][0].re == 40.0 );
  CPPUNIT_ASSERT( M.cplx[3][0].re == 50.0 );

  result = MTX_RemoveColumn( &M, 1 );
  CPPUNIT_ASSERT( result );
  CPPUNIT_ASSERT( M.nrows == 1 && M.ncols == 3 );
  CPPUNIT_ASSERT( M.cplx[0][0].re == 20.0 );
  CPPUNIT_ASSERT( M.cplx[1][0].re == 40.0 );
  CPPUNIT_ASSERT( M.cplx[2][0].re == 50.0 );  

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



void TestCase_cmatrix::Test_MTX_RemoveColumnsAfterIndex()
{
  CMTX_TIMING_START();
  unsigned nrows = 1;
  unsigned ncols = 5; 
  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[2][0] = 30;
  M.data[3][0] = 40;
  M.data[4][0] = 50;

  result = MTX_RemoveColumnsAfterIndex( &M, 2 );
  CPPUNIT_ASSERT( result );
  CPPUNIT_ASSERT( M.nrows == 1 && M.ncols == 3 );
  CPPUNIT_ASSERT( M.data[0][0] == 10 );
  CPPUNIT_ASSERT( M.data[1][0] == 20 );
  CPPUNIT_ASSERT( M.data[2][0] == 30 );

  result = MTX_RemoveColumnsAfterIndex( &M, 0 );
  CPPUNIT_ASSERT( result );
  CPPUNIT_ASSERT( M.nrows == 1 && M.ncols == 1 );
  CPPUNIT_ASSERT( M.data[0][0] == 10 );
  
  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].re = 20;
  M.cplx[2][0].re = 30;
  M.cplx[3][0].re = 40;
  M.cplx[4][0].re = 50;

  result = MTX_RemoveColumnsAfterIndex( &M, 2 );
  CPPUNIT_ASSERT( result );
  CPPUNIT_ASSERT( M.nrows == 1 && M.ncols == 3 );
  CPPUNIT_ASSERT( M.cplx[0][0].re == 10 );
  CPPUNIT_ASSERT( M.cplx[1][0].re == 20 );
  CPPUNIT_ASSERT( M.cplx[2][0].re == 30 );

  result = MTX_RemoveColumnsAfterIndex( &M, 0 );
  CPPUNIT_ASSERT( result );
  CPPUNIT_ASSERT( M.nrows == 1 && M.ncols == 1 );
  CPPUNIT_ASSERT( M.cplx[0][0].re == 10 );

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



void TestCase_cmatrix::Test_MTX_InsertColumn()
{
  CMTX_TIMING_START();
  unsigned nrows = 1;
  unsigned ncols = 5; 
  MTX M;
  MTX B;
  BOOL result;

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

  result = MTX_Init( &B );
  CPPUNIT_ASSERT( result );
  result = MTX_Calloc( &B, nrows, 1, true );
  CPPUNIT_ASSERT( result );

  B.data[0][0] = 12;

  result = MTX_InsertColumn( &M, &B, 0, 0 );
  CPPUNIT_ASSERT( result );
  CPPUNIT_ASSERT( M.nrows == nrows && M.ncols == ncols+1 );
  CPPUNIT_ASSERT( M.data[0][0] == 12 );

  M.data[1][0] = 32;
  B.data[0][0] = 24;
  result = MTX_InsertColumn( &M, &B, 1, 0 );
  CPPUNIT_ASSERT( result );
  CPPUNIT_ASSERT( M.nrows == nrows && M.ncols == ncols+2 );
  CPPUNIT_ASSERT( M.data[0][0] == 12 );
  CPPUNIT_ASSERT( M.data[1][0] == 24 );
  CPPUNIT_ASSERT( M.data[2][0] == 32 );

  result = MTX_AddColumn( &M, &B, 0 );
  CPPUNIT_ASSERT( result );
  CPPUNIT_ASSERT( M.nrows == nrows && M.ncols == ncols+3 );
  CPPUNIT_ASSERT( M.data[ncols+2][0] == 24 );

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

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

  B.cplx[0][0].re = 12;

  result = MTX_InsertColumn( &M, &B, 0, 0 );
  CPPUNIT_ASSERT( result );
  CPPUNIT_ASSERT( M.nrows == nrows && M.ncols == ncols+1 );
  CPPUNIT_ASSERT( M.cplx[0][0].re == 12 );

  M.cplx[1][0].re = 32;
  B.cplx[0][0].re = 24;
  result = MTX_InsertColumn( &M, &B, 1, 0 );
  CPPUNIT_ASSERT( result );
  CPPUNIT_ASSERT( M.nrows == nrows && M.ncols == ncols+2 );
  CPPUNIT_ASSERT( M.cplx[0][0].re == 12 );
  CPPUNIT_ASSERT( M.cplx[1][0].re == 24 );
  CPPUNIT_ASSERT( M.cplx[2][0].re == 32 );

  result = MTX_AddColumn( &M, &B, 0 );
  CPPUNIT_ASSERT( result );
  CPPUNIT_ASSERT( M.nrows == nrows && M.ncols == ncols+3 );
  CPPUNIT_ASSERT( M.cplx[ncols+2][0].re == 24 );

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

  // mixed case, inserting real column data to a complex matrix
  nrows = 1;
  ncols = 5; 
  
  result = MTX_Calloc( &M, nrows, ncols, false );
  CPPUNIT_ASSERT( result );
  result = MTX_Calloc( &B, nrows, 1, true );
  CPPUNIT_ASSERT( result );

  B.data[0][0] = 12;

  result = MTX_InsertColumn( &M, &B, 0, 0 );
  CPPUNIT_ASSERT( result );
  CPPUNIT_ASSERT( M.nrows == nrows && M.ncols == ncols+1 );
  CPPUNIT_ASSERT( M.cplx[0][0].re == 12 );

  M.cplx[1][0].re = 32;
  B.data[0][0] = 24;
  result = MTX_InsertColumn( &M, &B, 1, 0 );
  CPPUNIT_ASSERT( result );
  CPPUNIT_ASSERT( M.nrows == nrows && M.ncols == ncols+2 );
  CPPUNIT_ASSERT( M.cplx[0][0].re == 12 );
  CPPUNIT_ASSERT( M.cplx[1][0].re == 24 );
  CPPUNIT_ASSERT( M.cplx[2][0].re == 32 );

  result = MTX_AddColumn( &M, &B, 0 );
  CPPUNIT_ASSERT( result );
  CPPUNIT_ASSERT( M.nrows == nrows && M.ncols == ncols+3 );
  CPPUNIT_ASSERT( M.cplx[ncols+2][0].re == 24 );

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

  // mixed case, inserting complex column data to a real matrix that must become complex
  nrows = 1;
  ncols = 5; 
  
  result = MTX_Calloc( &M, nrows, ncols, true );
  CPPUNIT_ASSERT( result );
  result = MTX_Calloc( &B, nrows, 1, false );
  CPPUNIT_ASSERT( result );

  M.data[0][0] = 100;
  B.cplx[0][0].re = 12;

  result = MTX_InsertColumn( &M, &B, 0, 0 );
  CPPUNIT_ASSERT( result );
  CPPUNIT_ASSERT( !M.isReal ); 
  CPPUNIT_ASSERT( M.nrows == nrows && M.ncols == ncols+1 );
  CPPUNIT_ASSERT( M.cplx[0][0].re == 12 );
  CPPUNIT_ASSERT( M.cplx[1][0].re == 100 );
  
  result = MTX_Free( &M );
  CPPUNIT_ASSERT( result );
  result = MTX_Free( &B );
  CPPUNIT_ASSERT( result );
  CMTX_TIMING_END();
}



void TestCase_cmatrix::Test_MTX_Concatonate()
{
  CMTX_TIMING_START();
  unsigned nrows = 2;
  unsigned ncols = 2; 
  MTX A;
  MTX B;
  BOOL result;

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

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

  A.data[0][0] = 1;
  A.data[1][0] = 2;
  A.data[0][1] = 3;
  A.data[1][1] = 4;
  B.data[0][0] = 5;
  B.data[1][0] = 6;
  B.data[0][1] = 7;
  B.data[1][1] = 8;

  result = MTX_Concatonate( &A, &B );
  CPPUNIT_ASSERT( result );
  CPPUNIT_ASSERT( A.ncols == ncols*2 && A.nrows == nrows );
  CPPUNIT_ASSERT( A.data[0][0] == 1 );
  CPPUNIT_ASSERT( A.data[1][0] == 2 );
  CPPUNIT_ASSERT( A.data[2][0] == 5 );
  CPPUNIT_ASSERT( A.data[3][0] == 6 );
  CPPUNIT_ASSERT( A.data[0][1] == 3 );
  CPPUNIT_ASSERT( A.data[1][1] == 4 );  
  CPPUNIT_ASSERT( A.data[2][1] == 7 );  
  CPPUNIT_ASSERT( A.data[3][1] == 8 );  
  
  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, nrows, ncols, false );
  CPPUNIT_ASSERT( result );

  A.cplx[0][0].re = 1;
  A.cplx[1][0].re = 2;
  A.cplx[0][1].re = 3;
  A.cplx[1][1].re = 4;
  B.cplx[0][0].re = 5;
  B.cplx[1][0].re = 6;
  B.cplx[0][1].re = 7;
  B.cplx[1][1].re = 8;

  result = MTX_Concatonate( &A, &B );
  CPPUNIT_ASSERT( result );
  CPPUNIT_ASSERT( A.ncols == ncols*2 && A.nrows == nrows );
  CPPUNIT_ASSERT( A.cplx[0][0].re == 1 );
  CPPUNIT_ASSERT( A.cplx[1][0].re == 2 );
  CPPUNIT_ASSERT( A.cplx[2][0].re == 5 );
  CPPUNIT_ASSERT( A.cplx[3][0].re == 6 );
  CPPUNIT_ASSERT( A.cplx[0][1].re == 3 );
  CPPUNIT_ASSERT( A.cplx[1][1].re == 4 );  
  CPPUNIT_ASSERT( A.cplx[2][1].re == 7 );  
  CPPUNIT_ASSERT( A.cplx[3][1].re == 8 );  
  
  result = MTX_Free( &A );
  CPPUNIT_ASSERT( result );
  result = MTX_Free( &B );
  CPPUNIT_ASSERT( result );

  // mixed case, complexA | realB = complexA|B
  result = MTX_Calloc( &A, nrows, ncols, false );
  CPPUNIT_ASSERT( result );
  result = MTX_Calloc( &B, nrows, ncols, true );
  CPPUNIT_ASSERT( result );

  A.cplx[0][0].re = 1;
  A.cplx[1][0].re = 2;
  A.cplx[0][1].re = 3;
  A.cplx[1][1].re = 4;
  B.data[0][0] = 5;
  B.data[1][0] = 6;
  B.data[0][1] = 7;
  B.data[1][1] = 8;

  result = MTX_Concatonate( &A, &B );
  CPPUNIT_ASSERT( result );
  CPPUNIT_ASSERT( A.ncols == ncols*2 && A.nrows == nrows );
  CPPUNIT_ASSERT( A.cplx[0][0].re == 1 );
  CPPUNIT_ASSERT( A.cplx[1][0].re == 2 );
  CPPUNIT_ASSERT( A.cplx[2][0].re == 5 );
  CPPUNIT_ASSERT( A.cplx[3][0].re == 6 );
  CPPUNIT_ASSERT( A.cplx[0][1].re == 3 );
  CPPUNIT_ASSERT( A.cplx[1][1].re == 4 );  
  CPPUNIT_ASSERT( A.cplx[2][1].re == 7 );  
  CPPUNIT_ASSERT( A.cplx[3][1].re == 8 );  
  
  result = MTX_Free( &A );
  CPPUNIT_ASSERT( result );
  result = MTX_Free( &B );
  CPPUNIT_ASSERT( result );

  // mixed case, realA | complexB = complexA|B
  result = MTX_Calloc( &A, nrows, ncols, true );
  CPPUNIT_ASSERT( result );
  result = MTX_Calloc( &B, nrows, ncols, false );
  CPPUNIT_ASSERT( result );

  A.data[0][0] = 1;
  A.data[1][0] = 2;
  A.data[0][1] = 3;
  A.data[1][1] = 4;
  B.cplx[0][0].re = 5;
  B.cplx[1][0].re = 6;
  B.cplx[0][1].re = 7;
  B.cplx[1][1].re = 8;

  result = MTX_Concatonate( &A, &B );
  CPPUNIT_ASSERT( result );
  CPPUNIT_ASSERT( !A.isReal );
  CPPUNIT_ASSERT( A.ncols == ncols*2 && A.nrows == nrows );
  CPPUNIT_ASSERT( A.cplx[0][0].re == 1 );
  CPPUNIT_ASSERT( A.cplx[1][0].re == 2 );
  CPPUNIT_ASSERT( A.cplx[2][0].re == 5 );
  CPPUNIT_ASSERT( A.cplx[3][0].re == 6 );
  CPPUNIT_ASSERT( A.cplx[0][1].re == 3 );
  CPPUNIT_ASSERT( A.cplx[1][1].re == 4 );  
  CPPUNIT_ASSERT( A.cplx[2][1].re == 7 );  
  CPPUNIT_ASSERT( A.cplx[3][1].re == 8 );  
  
  result = MTX_Free( &A );
  CPPUNIT_ASSERT( result );
  result = MTX_Free( &B );
  CPPUNIT_ASSERT( result );
  CMTX_TIMING_END();
}



void TestCase_cmatrix::Test_MTX_Redim()
{
  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] = 1;
  M.data[1][0] = 2;
  M.data[0][1] = 3;
  M.data[1][1] = 4;
  
  result = MTX_Redim( &M, nrows, ncols+3 );
  CPPUNIT_ASSERT( result );
  CPPUNIT_ASSERT( M.nrows == nrows && M.ncols == ncols+3 );
  CPPUNIT_ASSERT( M.data[0][0] == 1 );
  CPPUNIT_ASSERT( M.data[1][0] == 2 );
  CPPUNIT_ASSERT( M.data[0][1] == 3 );

⌨️ 快捷键说明

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