int TestInverse(const int size_m)
{
int i,j,errors=0;
matrix matrix_a(size_m,size_m);
//--- 正方行列に書き込む
MatrixTestFirst(matrix_a);
//--- マイクロ秒が測定される
ulong t1=GetMicrosecondCount();
//--- 逆行列を取得する
matrix inverse=matrix_a.Inv();
//--- 測定する
ulong t2=GetMicrosecondCount();
//--- 正しさを確認する
matrix identity=matrix_a.MatMul(inverse);
//---
for(i=0; i<size_m; i++)
{
for(j=0; j<size_m; j++)
{
double value;
//--- 1は対角線に沿っている必要がある
if(i==j)
value=1.0;
else
value=0.0;
if(MathClassify(identity[i][j])>FP_ZERO)
errors++;
else
{
if(identity[i][j]!=value)
{
double diff=MathAbs(identity[i][j]-value);
//--- 掛け算と割り算が多すぎるので、チェックの精度を下げる
if(diff>1e-9)
errors++;
}
}
}
}
//---
double elapsed_time=double(t2-t1)/1000.0;
printf("Inversion of matrix %d x %d %s errors=%d time=%.3f ms",size_m,size_m,errors==0?"passed":"failed",errors,elapsed_time);
return(errors);
}
|