testcase_cmatrix.cpp
来自「c++ 实现的矩阵运算库」· C++ 代码 · 共 2,500 行 · 第 1/5 页
CPP
2,500 行
CPPUNIT_ASSERT( M.data[1][1] == 4 );
result = MTX_Redim( &M, nrows, ncols );
CPPUNIT_ASSERT( result );
CPPUNIT_ASSERT( M.nrows == nrows && M.ncols == ncols );
CPPUNIT_ASSERT( M.data[0][0] == 1 );
CPPUNIT_ASSERT( M.data[1][0] == 2 );
CPPUNIT_ASSERT( M.data[0][1] == 3 );
CPPUNIT_ASSERT( M.data[1][1] == 4 );
result = MTX_Redim( &M, nrows-1, ncols );
CPPUNIT_ASSERT( result );
CPPUNIT_ASSERT( M.nrows == nrows-1 && M.ncols == ncols );
CPPUNIT_ASSERT( M.data[0][0] == 1 );
CPPUNIT_ASSERT( M.data[1][0] == 2 );
result = MTX_Redim( &M, nrows, ncols );
CPPUNIT_ASSERT( result );
CPPUNIT_ASSERT( M.nrows == nrows && M.ncols == ncols );
CPPUNIT_ASSERT( M.data[0][0] == 1 );
CPPUNIT_ASSERT( M.data[1][0] == 2 );
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 = 1;
M.cplx[1][0].re = 2;
M.cplx[0][1].re = 3;
M.cplx[1][1].re = 4;
result = MTX_Redim( &M, nrows, ncols+3 );
CPPUNIT_ASSERT( result );
CPPUNIT_ASSERT( !M.isReal );
CPPUNIT_ASSERT( M.nrows == nrows && M.ncols == ncols+3 );
CPPUNIT_ASSERT( M.cplx[0][0].re == 1 );
CPPUNIT_ASSERT( M.cplx[1][0].re == 2 );
CPPUNIT_ASSERT( M.cplx[0][1].re == 3 );
CPPUNIT_ASSERT( M.cplx[1][1].re == 4 );
result = MTX_Redim( &M, nrows, ncols );
CPPUNIT_ASSERT( result );
CPPUNIT_ASSERT( !M.isReal );
CPPUNIT_ASSERT( M.nrows == nrows && M.ncols == ncols );
CPPUNIT_ASSERT( M.cplx[0][0].re == 1 );
CPPUNIT_ASSERT( M.cplx[1][0].re == 2 );
CPPUNIT_ASSERT( M.cplx[0][1].re == 3 );
CPPUNIT_ASSERT( M.cplx[1][1].re == 4 );
result = MTX_Redim( &M, nrows-1, ncols );
CPPUNIT_ASSERT( result );
CPPUNIT_ASSERT( !M.isReal );
CPPUNIT_ASSERT( M.nrows == nrows-1 && M.ncols == ncols );
CPPUNIT_ASSERT( M.cplx[0][0].re == 1 );
CPPUNIT_ASSERT( M.cplx[1][0].re == 2 );
result = MTX_Redim( &M, nrows, ncols );
CPPUNIT_ASSERT( result );
CPPUNIT_ASSERT( !M.isReal );
CPPUNIT_ASSERT( M.nrows == nrows && M.ncols == ncols );
CPPUNIT_ASSERT( M.cplx[0][0].re == 1 );
CPPUNIT_ASSERT( M.cplx[1][0].re == 2 );
CPPUNIT_ASSERT( M.cplx[0][1].re == 0 );
CPPUNIT_ASSERT( M.cplx[1][1].re == 0 );
result = MTX_Free( &M );
CPPUNIT_ASSERT( result );
CMTX_TIMING_END();
}
void TestCase_cmatrix::Test_MTX_Resize()
{
CMTX_TIMING_START();
unsigned nrows = 1;
unsigned ncols = 1;
MTX M;
BOOL result;
result = MTX_Init( &M );
CPPUNIT_ASSERT( result );
result = MTX_Calloc( &M, nrows, ncols, true );
CPPUNIT_ASSERT( result );
result = MTX_Resize( &M, 2, 2, true );
CPPUNIT_ASSERT( result );
CPPUNIT_ASSERT( M.nrows == 2 && M.ncols == 2 );
result = MTX_Free( &M );
CPPUNIT_ASSERT( result );
// complex case
result = MTX_Calloc( &M, nrows, ncols, false );
CPPUNIT_ASSERT( result );
result = MTX_Resize( &M, 2, 2, false );
CPPUNIT_ASSERT( result );
CPPUNIT_ASSERT( !M.isReal );
CPPUNIT_ASSERT( M.nrows == 2 && M.ncols == 2 );
result = MTX_Free( &M );
CPPUNIT_ASSERT( result );
CMTX_TIMING_END();
}
void TestCase_cmatrix::Test_MTX_Copy()
{
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 );
// MTX_Malloc will be called in Copy
A.data[0][0] = 1;
A.data[1][0] = 2;
A.data[0][1] = 3;
A.data[1][1] = 4;
result = MTX_Copy( &A, &B );
CPPUNIT_ASSERT( result );
CPPUNIT_ASSERT( B.ncols == ncols && B.nrows == nrows );
CPPUNIT_ASSERT( A.data[0][0] == 1 );
CPPUNIT_ASSERT( A.data[1][0] == 2 );
CPPUNIT_ASSERT( A.data[0][1] == 3 );
CPPUNIT_ASSERT( A.data[1][1] == 4 );
CPPUNIT_ASSERT( B.data[0][0] == 1 );
CPPUNIT_ASSERT( B.data[1][0] == 2 );
CPPUNIT_ASSERT( B.data[0][1] == 3 );
CPPUNIT_ASSERT( B.data[1][1] == 4 );
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 );
// MTX_Malloc will be called in Copy
A.cplx[0][0].re = 1;
A.cplx[1][0].re = 2;
A.cplx[0][1].re = 3;
A.cplx[1][1].re = 4;
result = MTX_Copy( &A, &B );
CPPUNIT_ASSERT( result );
CPPUNIT_ASSERT( !B.isReal );
CPPUNIT_ASSERT( B.ncols == ncols && B.nrows == nrows );
CPPUNIT_ASSERT( A.cplx[0][0].re == 1 );
CPPUNIT_ASSERT( A.cplx[1][0].re == 2 );
CPPUNIT_ASSERT( A.cplx[0][1].re == 3 );
CPPUNIT_ASSERT( A.cplx[1][1].re == 4 );
CPPUNIT_ASSERT( B.cplx[0][0].re == 1 );
CPPUNIT_ASSERT( B.cplx[1][0].re == 2 );
CPPUNIT_ASSERT( B.cplx[0][1].re == 3 );
CPPUNIT_ASSERT( B.cplx[1][1].re == 4 );
result = MTX_Free( &A );
CPPUNIT_ASSERT( result );
result = MTX_Free( &B );
CPPUNIT_ASSERT( result );
CMTX_TIMING_END();
}
void TestCase_cmatrix::Test_MTX_CopyIntoColumnWiseVector()
{
CMTX_TIMING_START();
unsigned nrows = 1;
unsigned ncols = 4;
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 );
// MTX_Malloc will be called in Copy
A.data[0][0] = 1;
A.data[1][0] = 2;
A.data[2][0] = 3;
A.data[3][0] = 4;
result = MTX_CopyIntoColumnWiseVector( &A, &B );
CPPUNIT_ASSERT( result );
CPPUNIT_ASSERT( B.ncols == 1 && B.nrows == nrows*ncols );
CPPUNIT_ASSERT( A.data[0][0] == 1 );
CPPUNIT_ASSERT( A.data[1][0] == 2 );
CPPUNIT_ASSERT( A.data[2][0] == 3 );
CPPUNIT_ASSERT( A.data[3][0] == 4 );
CPPUNIT_ASSERT( B.data[0][0] == 1 );
CPPUNIT_ASSERT( B.data[0][1] == 2 );
CPPUNIT_ASSERT( B.data[0][2] == 3 );
CPPUNIT_ASSERT( B.data[0][3] == 4 );
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 );
// MTX_Malloc will be called in Copy
A.cplx[0][0].re = 1;
A.cplx[1][0].re = 2;
A.cplx[2][0].re = 3;
A.cplx[3][0].re = 4;
result = MTX_CopyIntoColumnWiseVector( &A, &B );
CPPUNIT_ASSERT( result );
CPPUNIT_ASSERT( !B.isReal );
CPPUNIT_ASSERT( B.ncols == 1 && B.nrows == nrows*ncols );
CPPUNIT_ASSERT( A.cplx[0][0].re == 1 );
CPPUNIT_ASSERT( A.cplx[1][0].re == 2 );
CPPUNIT_ASSERT( A.cplx[2][0].re == 3 );
CPPUNIT_ASSERT( A.cplx[3][0].re == 4 );
CPPUNIT_ASSERT( B.cplx[0][0].re == 1 );
CPPUNIT_ASSERT( B.cplx[0][1].re == 2 );
CPPUNIT_ASSERT( B.cplx[0][2].re == 3 );
CPPUNIT_ASSERT( B.cplx[0][3].re == 4 );
result = MTX_Free( &A );
CPPUNIT_ASSERT( result );
result = MTX_Free( &B );
CPPUNIT_ASSERT( result );
CMTX_TIMING_END();
}
void TestCase_cmatrix::Test_MTX_SetFromStaticMatrix()
{
CMTX_TIMING_START();
unsigned nrows = 2;
unsigned ncols = 2;
MTX A;
BOOL result;
double mat[4] = {1,2,3,4};
result = MTX_Init( &A );
CPPUNIT_ASSERT( result );
result = MTX_SetFromStaticMatrix( &A, mat, 2, 2 );
CPPUNIT_ASSERT( result );
CPPUNIT_ASSERT( A.ncols == ncols && A.nrows == nrows );
CPPUNIT_ASSERT( A.data[0][0] == 1 );
CPPUNIT_ASSERT( A.data[1][0] == 2 );
CPPUNIT_ASSERT( A.data[0][1] == 3 );
CPPUNIT_ASSERT( A.data[1][1] == 4 );
result = MTX_Free( &A );
CPPUNIT_ASSERT( result );
CMTX_TIMING_END();
}
void TestCase_cmatrix::Test_MTX_CopyColumn()
{
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 );
A.data[0][0] = 1;
A.data[1][0] = 2;
A.data[0][1] = 3;
A.data[1][1] = 4;
result = MTX_CopyColumn( &A, 0, &B );
CPPUNIT_ASSERT( result );
CPPUNIT_ASSERT( B.ncols == 1 && B.nrows == nrows );
CPPUNIT_ASSERT( A.data[0][0] == 1 );
CPPUNIT_ASSERT( A.data[1][0] == 2 );
CPPUNIT_ASSERT( A.data[0][1] == 3 );
CPPUNIT_ASSERT( A.data[1][1] == 4 );
CPPUNIT_ASSERT( B.data[0][0] == 1 );
CPPUNIT_ASSERT( B.data[0][1] == 3 );
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 );
A.cplx[0][0].re = 1;
A.cplx[1][0].re = 2;
A.cplx[0][1].re = 3;
A.cplx[1][1].re = 4;
result = MTX_CopyColumn( &A, 0, &B );
CPPUNIT_ASSERT( result );
CPPUNIT_ASSERT( !B.isReal );
CPPUNIT_ASSERT( B.ncols == 1 && B.nrows == nrows );
CPPUNIT_ASSERT( A.cplx[0][0].re == 1 );
CPPUNIT_ASSERT( A.cplx[1][0].re == 2 );
CPPUNIT_ASSERT( A.cplx[0][1].re == 3 );
CPPUNIT_ASSERT( A.cplx[1][1].re == 4 );
CPPUNIT_ASSERT( B.cplx[0][0].re == 1 );
CPPUNIT_ASSERT( B.cplx[0][1].re == 3 );
result = MTX_Free( &A );
CPPUNIT_ASSERT( result );
result = MTX_Free( &B );
CPPUNIT_ASSERT( result );
CMTX_TIMING_END();
}
void TestCase_cmatrix::Test_MTX_CopyRow()
{
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 );
A.data[0][0] = 1;
A.data[1][0] = 2;
A.data[0][1] = 3;
A.data[1][1] = 4;
result = MTX_CopyRow( &A, 0, &B );
CPPUNIT_ASSERT( result );
CPPUNIT_ASSERT( B.ncols == ncols && B.nrows == 1 );
CPPUNIT_ASSERT( A.data[0][0] == 1 );
CPPUNIT_ASSERT( A.data[1][0] == 2 );
CPPUNIT_ASSERT( A.data[0][1] == 3 );
CPPUNIT_ASSERT( A.data[1][1] == 4 );
CPPUNIT_ASSERT( B.data[0][0] == 1 );
CPPUNIT_ASSERT( B.data[1][0] == 2 );
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 );
A.cplx[0][0].re = 1;
A.cplx[1][0].re = 2;
A.cplx[0][1].re = 3;
A.cplx[1][1].re = 4;
result = MTX_CopyRow( &A, 0, &B );
CPPUNIT_ASSERT( result );
CPPUNIT_ASSERT( !B.isReal );
CPPUNIT_ASSERT( B.ncols == ncols && B.nrows == 1 );
CPPUNIT_ASSERT( A.cplx[0][0].re == 1 );
CPPUNIT_ASSERT( A.cplx[1][0].re == 2 );
CPPUNIT_ASSERT( A.cplx[0][1].re == 3 );
CPPUNIT_ASSERT( A.cplx[1][1].re == 4 );
CPPUNIT_ASSERT( B.cplx[0][0].re == 1 );
CPPUNIT_ASSERT( B.cplx[1][0].re == 2 );
result = MTX_Free( &A );
CPPUNIT_ASSERT( result );
result = MTX_Free( &B );
CPPUNIT_ASSERT( result );
CMTX_TIMING_END();
}
void TestCase_cmatrix::Test_MTX_InsertSubMatrix()
{
CMTX_TIMING_START();
unsigned nrows = 4;
unsigned ncols = 4;
MTX A;
MTX B;
BOOL result;
result = MTX_Init( &A );
CPPUNIT_ASSERT( result );
result = MTX_Init( &B );
CPPUNIT_ASSERT( result );
result = MTX_Calloc( &A, nrows, ncols, true );
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.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] == 1 );
CPPUNIT_ASSERT( A.data[2][1] == 2 );
CPPUNIT_ASSERT( A.data[3][1] == 0 );
CPPUNIT_ASSERT( A.data[0][2] == 0 );
CPPUNIT_ASSERT( A.data[1][2] == 3 );
CPPUNIT_ASSERT( A.data[2][2] == 4 );
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, 0, 0 );
CPPUNIT_ASSERT( result );
CPPUNIT_ASSERT( A.data[0][0] == 1 );
CPPUNIT_ASSERT( A.data[1][0] == 2 );
CPPUNIT_ASSERT( A.data[2][0] == 0 );
CPPUNIT_ASSERT( A.data[3][0] == 0 );
CPPUNIT_ASSERT( A.data[0][1] == 3 );
CPPUNIT_ASSERT( A.data[1][1] == 4 );
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] == 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, 0, 2 );
CPPUNIT_ASSERT( result );
CPPUNIT_ASSERT( A.data[0][0] == 0 );
CPPUNIT_ASSERT( A.data[1][0] == 0 );
CPPUNIT_ASSERT( A.data[2][0] == 1 );
CPPUNIT_ASSERT( A.data[3][0] == 2 );
CPPUNIT_ASSERT( A.data[0][1] == 0 );
CPPUNIT_ASSERT( A.data[1][1] == 0 );
CPPUNIT_ASSERT( A.data[2][1] == 3 );
CPPUNIT_ASSERT( A.data[3][1] == 4 );
CPPUNIT_ASSERT( A.data[0][2] == 0 );
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?