testcase_cmatrix.cpp

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

CPP
2,500
字号
  CPPUNIT_ASSERT( M.cplx[0][1].im == 3 );
  CPPUNIT_ASSERT( M.cplx[1][0].re == 3 );
  CPPUNIT_ASSERT( M.cplx[1][0].im == 2 );
  CPPUNIT_ASSERT( M.cplx[1][1].re == 4 );
  CPPUNIT_ASSERT( M.cplx[1][1].im == 1 );

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

  result = MTX_Complex( &M, &Re, &Im );
  CPPUNIT_ASSERT( result == false );
  
  result = MTX_Calloc( &Re, nrows, 1, true );
  CPPUNIT_ASSERT( result );

  result = MTX_Complex( &M, &Re, &Im );
  CPPUNIT_ASSERT( result == false );

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



void TestCase_cmatrix::Test_MTX_ConvertRealToComplex()
{
  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_ConvertRealToComplex( &M );
  CPPUNIT_ASSERT( result );

  CPPUNIT_ASSERT( M.data == NULL );
  CPPUNIT_ASSERT( M.nrows == nrows );
  CPPUNIT_ASSERT( M.ncols == ncols );
  CPPUNIT_ASSERT( M.cplx != NULL );
  CPPUNIT_ASSERT( !M.isReal );

  CPPUNIT_ASSERT( M.cplx[0][0].re == 10 );
  CPPUNIT_ASSERT( M.cplx[1][0].re == 20 );
  CPPUNIT_ASSERT( M.cplx[0][1].re == 30 );
  CPPUNIT_ASSERT( M.cplx[1][1].re == 40 );

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

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


void TestCase_cmatrix::Test_MTX_ConvertComplexToReal()
{
  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, false );
  CPPUNIT_ASSERT( result );

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

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

  CPPUNIT_ASSERT( M.data != NULL );
  CPPUNIT_ASSERT( M.nrows == nrows );
  CPPUNIT_ASSERT( M.ncols == ncols );
  CPPUNIT_ASSERT( M.cplx == NULL );
  CPPUNIT_ASSERT( M.isReal );

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

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

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


void TestCase_cmatrix::Test_MTX_ConvertComplexToImag()
{
  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, false );
  CPPUNIT_ASSERT( result );

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

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

  CPPUNIT_ASSERT( M.data != NULL );
  CPPUNIT_ASSERT( M.nrows == nrows );
  CPPUNIT_ASSERT( M.ncols == ncols );
  CPPUNIT_ASSERT( M.cplx == NULL );
  CPPUNIT_ASSERT( M.isReal );

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

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

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


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

  result = MTX_Init( &M );
  CPPUNIT_ASSERT( result );
  result = MTX_Init( &Re );
  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_Real( &M, &Re );
  CPPUNIT_ASSERT( result );
  CPPUNIT_ASSERT( Re.isReal );
  CPPUNIT_ASSERT( Re.nrows == 2 );
  CPPUNIT_ASSERT( Re.ncols == 2 );

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

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



void TestCase_cmatrix::Test_MTX_isReal()
{
  CMTX_TIMING_START();
  MTX M;
  BOOL result;
  BOOL isReal;
  
  result = MTX_Init( &M );
  CPPUNIT_ASSERT( result );

  result = MTX_Calloc( &M, 1, 1, true );
  CPPUNIT_ASSERT( result );

  result = MTX_isReal( &M, &isReal );
  CPPUNIT_ASSERT( result );
  CPPUNIT_ASSERT( isReal );

  result = MTX_Calloc( &M, 1, 1, false );
  CPPUNIT_ASSERT( result );

  // The matrix will change to real!
  result = MTX_isReal( &M, &isReal );
  CPPUNIT_ASSERT( result );
  CPPUNIT_ASSERT( M.isReal );
  CPPUNIT_ASSERT( isReal );

  result = MTX_Calloc( &M, 1, 1, false );
  CPPUNIT_ASSERT( result );

  M.cplx[0][0].re = 1.0;
  M.cplx[0][0].im = 1.0;

  result = MTX_isReal( &M, &isReal );
  CPPUNIT_ASSERT( result );
  CPPUNIT_ASSERT( !M.isReal );
  CPPUNIT_ASSERT( !isReal );

  result = MTX_Calloc( &M, 1, 1, false );
  CPPUNIT_ASSERT( result );

  M.cplx[0][0].re = 1.0;
  M.cplx[0][0].im = -1.0;

  result = MTX_isReal( &M, &isReal );
  CPPUNIT_ASSERT( result );
  CPPUNIT_ASSERT( !M.isReal );
  CPPUNIT_ASSERT( !isReal );

  result = MTX_Calloc( &M, 2, 2, false );
  CPPUNIT_ASSERT( result );

  M.cplx[1][1].re = 0.0;
  M.cplx[1][1].im = -1.0;

  result = MTX_isReal( &M, &isReal );
  CPPUNIT_ASSERT( result );
  CPPUNIT_ASSERT( !M.isReal );
  CPPUNIT_ASSERT( !isReal );

  M.cplx[1][1].re = 1.0;
  M.cplx[1][1].im = 0.0;

  result = MTX_isReal( &M, &isReal );
  CPPUNIT_ASSERT( result );
  CPPUNIT_ASSERT( M.isReal );
  CPPUNIT_ASSERT( isReal );

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




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

  result = MTX_Init( &M );
  CPPUNIT_ASSERT( result );
  result = MTX_Init( &Re );
  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_RealColumn( &M, 0, &Re );
  CPPUNIT_ASSERT( result );
  CPPUNIT_ASSERT( Re.isReal );
  CPPUNIT_ASSERT( Re.nrows == 2 );
  CPPUNIT_ASSERT( Re.ncols == 1 );

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

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



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

  result = MTX_Init( &M );
  CPPUNIT_ASSERT( result );
  result = MTX_Init( &Im );
  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_Imag( &M, &Im );
  CPPUNIT_ASSERT( result );
  CPPUNIT_ASSERT( Im.isReal );
  CPPUNIT_ASSERT( Im.nrows == 2 );
  CPPUNIT_ASSERT( Im.ncols == 2 );

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

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





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

  result = MTX_Init( &M );
  CPPUNIT_ASSERT( result );
  result = MTX_Init( &Im );
  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_ImagColumn( &M, 0, &Im );
  CPPUNIT_ASSERT( result );
  CPPUNIT_ASSERT( Im.isReal );
  CPPUNIT_ASSERT( Im.nrows == 2 );
  CPPUNIT_ASSERT( Im.ncols == 1 );

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

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




void TestCase_cmatrix::Test_MTX_Magnitude()
{
  CMTX_TIMING_START();
  MTX M;
  MTX mag;
  BOOL result;
  unsigned nrows = 2;
  unsigned ncols = 2; 
  double dif;

  result = MTX_Init( &M );
  CPPUNIT_ASSERT( result );
  result = MTX_Init( &mag );
  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_Magnitude( &M, &mag );
  CPPUNIT_ASSERT( result );
  CPPUNIT_ASSERT( mag.isReal );

  dif = mag.data[0][0] - 4.12310562561766;
  CPPUNIT_ASSERT( fabs( dif ) < 1e-12 );
  dif = mag.data[0][1] - 3.60555127546399;
  CPPUNIT_ASSERT( fabs( dif ) < 1e-12 );
  dif = mag.data[1][0] - 3.60555127546399;
  CPPUNIT_ASSERT( fabs( dif ) < 1e-12 );
  dif = mag.data[1][1] - 4.12310562561766;
  CPPUNIT_ASSERT( fabs( dif ) < 1e-12 );

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


void TestCase_cmatrix::Test_MTX_Phase()
{
  CMTX_TIMING_START();
  MTX M;
  MTX P;
  BOOL result;
  unsigned nrows = 2;
  unsigned ncols = 2; 
  double dif;

  result = MTX_Init( &M );
  CPPUNIT_ASSERT( result );
  result = MTX_Init( &P );
  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_Phase( &M, &P );
  CPPUNIT_ASSERT( result );
  CPPUNIT_ASSERT( P.isReal );

  dif = P.data[0][0] - 1.32581766366803;
  CPPUNIT_ASSERT( fabs( dif ) < 1e-12 );
  dif = P.data[0][1] - 0.982793723247329;
  CPPUNIT_ASSERT( fabs( dif ) < 1e-12 );
  dif = P.data[1][0] - -2.55359005004223;
  CPPUNIT_ASSERT( fabs( dif ) < 1e-12 );
  dif = P.data[1][1] - -2.89661399046293;

⌨️ 快捷键说明

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