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 + -
显示快捷键?