⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 testmat.cpp

📁 UAV 自动驾驶的
💻 CPP
字号:
#include <iostream>#include <mat/Quat.h>#include <mat/Vector.h>#include <mat/Matrix.h>#include <mat/Matrix_Invert.h>#include <mat/Kalman.h>#include "old-matlib.h"#include <timer.h>#include <cstring>using namespace std;using namespace libmat;using namespace matlib;#define fill( m1, m2, a00, a01, a02, a10, a11, a12, a20, a21, a22 )	\	do {								\		m2[0][0] = m1[0][0]	= a00;				\		m2[0][1] = m1[0][1]	= a01;				\		m2[0][2] = m1[0][2]	= a02;				\									\		m2[1][0] = m1[1][0]	= a10;				\		m2[1][1] = m1[1][1]	= a11;				\		m2[1][2] = m1[1][2]	= a12;				\									\		m2[2][0] = m1[2][0]	= a20;				\		m2[2][1] = m1[2][1]	= a21;				\		m2[2][2] = m1[2][2]	= a22;				\	} while(0)							\#define compare( tag, old_m3, new_m3, n, m )				\    do {								\	int failed = 0;							\	cout << "Comparing " << tag << ": ";				\	for( int i=0; i<n ; i++ )					\	{								\		for( int j=0; j<m ; j++ )				\		{							\			if( old_m3[i][j] == new_m3[i][j] )		\				continue;				\			cerr						\				<< "ERROR: "				\				<< "[" << i << "," << j << "] "		\				<< old_m3[i][j]				\				<< " != "				\				<< new_m3[i][j]				\				<< endl;				\			failed = 1;					\		}							\	}								\									\	cout << (failed ? "FAILED" : "PASSED" ) << endl;		\	fail_count += failed;						\	test_count++;							\    } while(0)								\int main(){	const int	iters = 1<<16;	int		test_count = 0;	int		fail_count = 0;	double		old_m1[MAXSIZE][MAXSIZE];	double		old_m2[MAXSIZE][MAXSIZE];	double		old_m3[MAXSIZE][MAXSIZE];	Matrix<3,3>	new_m1;	Matrix<3,3>	new_m2;	Matrix<3,3>	new_m3;	fill( new_m1, old_m1,		9, 8, 2,		2, 3, 9,		1, 2, 4	);	fill( new_m2, old_m2,		1, 2, 2,		2, 1, 3,		4, 2, 4	);	cout		<< "Sizes: "		<< " new_m1=" << sizeof(new_m1)		<< " old_m1=" << sizeof(old_m1)		<< endl;	/* Identity matrix creation */	const Matrix<3,3,double> (*new_eye)() = eye<3,double>;	time_these( iters,		"new eye<3>", new_m3 = new_eye(),		"old eye(3)", eye( old_m3, 3 )	);	compare( "eye<3>", new_m3, old_m3, 3, 3 );	/* Matrix addition */	time_these( iters,		"new +", new_m3 = new_m1 + new_m2,		"old +", MMadd( old_m1, old_m2, old_m3, 3, 3 )	);	compare( "+", new_m3, old_m3, 3, 3 );	time_these( iters,		"new +=", new_m3 += new_m1,		"old +=", MMadd( old_m3, old_m1, old_m3, 3, 3 )	);	compare( "+=", new_m3, old_m3, 3, 3 );	/* Do dot product */	Vector<3>	new_v1;	Vector<3>	new_v2;	double		old_v1[MAXSIZE];	double		old_v2[MAXSIZE];	time_these( iters,		"new dot", double dot = new_v1 * new_v2,		"old dot", double d = dot( old_v1, old_v2, 3 )	);	/* Do matrix decomposition */	time_these( iters,		"new LU", LU( new_m1, new_m2, new_m3 ),		"old LU", LU( old_m1, old_m2, old_m3, 3 )	);	compare( "LU->L", old_m2, new_m2, 3, 3 );	compare( "LU->U", old_m3, new_m3, 3, 3 );	/* Do quaternion production */	typedef Matrix<3,3> m33_t;	Vector<3> new_angles( 0.17, -0.1, 3.1 );	new_m3 = eulerWx( new_angles );	time_these( iters,		"new wx", const m33_t new_m3( eulerWx( new_angles ) ),		"old wx", eulerWx( old_m3, 0.17, -0.1, 3.1 )	);	compare( "eulerWx", old_m3, new_m3, 3, 3 );	time_these( iters,		"new 3x3 mult", new_m3 = new_m1 * new_m2,		"old 3x3 mult", MMmult( old_m1, old_m2, old_m3, 3, 3, 3 )	);	compare( "MMmult", old_m3, new_m3, 3, 3 );	time_these( iters,		"new 3x3 invert", new_m2 = invert( new_m1 ),		"old 3x3 invert", inv( old_m1, old_m2, 3 )	);	compare( "invert", new_m2, old_m2, 3, 3 );	time_these( iters,		"new transpose", new_m2 = new_m1.transpose(),		"old transpose", transpose( old_m1, old_m2, 3, 3 )	);	compare( "transpose", new_m2, old_m2, 3, 3 );	/**	 *  Matrix * Vector ops	 */	Vector<3>		v_in( new_m2[0] );	Vector<3>		v_out;	time_these( iters,		"m*v", v_out = new_m1 * v_in,		"MVmult", MVmult( old_m1, old_m2[0], old_m3[0], 3, 3 )	);	new_m3[0] = v_out;	compare( "m*v", new_m3, old_m3, 3, 3 );	/**	 *  Chained operations	 */	time_these( iters,		"new chain", do {			new_m3 = invert((new_m1 -= new_m2) *= new_m2 - new_m2);		} while(0),		"old chain", do {			double temp[MAXSIZE][MAXSIZE];			MMsub( old_m1, old_m2, old_m1, 3, 3 );			MMmult( old_m1, old_m2, temp, 3, 3, 3 );			MMcopy( temp, old_m1, 3, 3 );			MMsub( temp, old_m2, temp, 3, 3 );			inv( temp, old_m3, 3 );		} while(0)	);	//compare( "chain", new_m3, old_m3, 3, 3 );	/**	 *  Non-square matrix manipulation	 */	Matrix<3,4>		m34;	Matrix<4,5>		m45;	Matrix<3,5>		m35;	memset( old_m1, 0, sizeof(old_m1) );	memset( old_m2, 0, sizeof(old_m2) );	fill( m34, old_m1,		9, 8, 2,		2, 3, 9,		1, 2, 4	);	fill( m45, old_m2,		1, 2, 2,		2, 1, 3,		4, 2, 4	);	time_these( iters,		"new 3x4x5 mult", m35 = m34 * m45,		"old 3x4x5 mult", MMmult( old_m1, old_m2, old_m3, 3, 4, 5 )	);	compare( "mult 3x4x5", old_m3, m35, 3, 5 );	/*	 *  Large matrix inversion	 */	Matrix<8,8>		m88;	Matrix<8,8>		m88_inv;	fill( m88, old_m1,		1, 2, 2,		2, 1, 3,		4, 2, 4	);	time_these( 1024,		"m88 invert", m88_inv = invert( m88 ),		"old invert", inv( old_m1, old_m2, 8 )	);	//compare( "8x8 invert", m88_inv, old_m2, 8, 8 );	/**	 *  Wrap up and output stats	 */	cout		<< endl		<< test_count << " tests, "		<< fail_count << " failed." 		<< endl;	return 0;}

⌨️ 快捷键说明

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