亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? matrix.cpp

?? 該程序包實(shí)現(xiàn)了模式識別中的兩個特征提取算法
?? CPP
字號:

#include <string.h>
#include <math.h>
#include "Matrix.h"

#define TZERO 1E-6

CMatrix::CMatrix()
{
}

CMatrix::~CMatrix()
{
}

// Check the orthonormality and characteristic equation
float CMatrix::characteristic( float** C, int dim, 
							   float* phi, float* lambta, int vecNum )
{
	float* tvec;
	tvec = new float [dim];

	int i, j;
	float ip, aver;	// inner product
	aver = 0;
	for( i=0; i<vecNum; i++ )
	{
		ip = innProduct( phi+i*dim, phi+i*dim, dim );	// normality
		aver += (float)fabs( ip-1 );
		for( j=0; j<i; j++ )
		{
			ip = innProduct( phi+i*dim, phi+j*dim, dim );	// orthogonality
			aver += (float)fabs( ip );
		}
	}
	aver /= vecNum*(vecNum+1)/2;

	float sum, total;

	total = 0;
	for( j=0; j<vecNum; j++ )
	{
		if( lambta[j]<0.0001 )
			continue;
		matXvec( C, phi+j*dim, dim, tvec );
		for( i=0; i<dim; i++ )
			tvec[i] -= lambta[j]*phi[j*dim+i];
		sum = innProduct( tvec, tvec, dim )/(lambta[j]*lambta[j]);
		total += sum;
	}
	total /= vecNum;

	delete tvec;

	return aver+total;
}

// Compute the eigenvectors and eigenvalues of a symmetric matrix
float CMatrix::KLT( float** C, int n, float* phi, float* lambta )
{
	float **A, **P;

	A = allocMat( n );
	P = allocMat( n );	// P stores the orthognal transformation matrix

	for( int i=0; i<n; i++ )
		memcpy( A[i], C[i], n*sizeof(float) );	// A: copy of covariance matrix

	diagonalize( A, n, P );

	// Sort the eigen values in decreasing order
	char* mark;
	mark = new char [n];
	memset( mark, 0, n );

	float total = 0;	// sum of eigenvalues, equals the variance
	int j, k;
	for( int m=0; m<n; m++ )
	{
		lambta[m] = -1;
		for( k=n-1; k>=0; k-- )		// The large eigenvalues usually at last
		{
			if( mark[k] )
				continue;

			if( A[k][k]>lambta[m] )
			{
				lambta[m] = A[k][k];
				j = k;		// j: the position of largest eigenvalue
			}
		}
		mark[j] = 1;

		total += lambta[m];
		for( i=0; i<n; i++ )
			phi[m*n+i] = P[i][j];	// column of transform matrix as eigen vector
	}

	freeMat( A, n );
	freeMat( P, n );
	delete mark;

	return total;
}

// Diagonalization of symmetric matrix
// P: transformation matrix
void CMatrix::diagonalize( float** A, int n, float** P )
{
	identiMat( P, n );	// initially identity matrix
	Householder( A, n, P );	// tri-diagonalization

	float* d;		// diagonal elements (eigen values)
	d = new float [n];

	for( int k=0; k<n-1; k++ )
	{
		d[k] = shiftQL( A, n, k, P );
		if( k>0 )
			d[k] += d[k-1];
	}
	d[n-1] = d[n-2]+A[n-1][n-1];

	for( k=0; k<n; k++ )
		A[k][k] = d[k];

	delete d;
}

// QL method with acceleration shifts
float CMatrix::shiftQL( float** A, int n, int k, float** P )
{
	float eigv = 0;
	float s1, s2;
	float b, c, sq, t;
	int i;

	while( fabs( A[k][k+1] )>TZERO )
	{
		b = -(A[k][k]+A[k+1][k+1]);
		c = A[k][k]*A[k+1][k+1]-A[k][k+1]*A[k][k+1];
		t = b*b-4*c;
		if( t<0 )		// modified 2006.06.08, found by Tianfu Gao
			sq = 0;
		else
			sq = (float)sqrt( t );
		s1 = (-b+sq)/2;
		s2 = (-b-sq)/2;
		if( fabs( A[k][k]-s1 )>fabs( A[k][k]-s2 ) )		// s2 is closer to d1
			s1 = s2;

		eigv += s1;

		for( i=k; i<n; i++ )
			A[i][i] -= s1;
		QLdecomp( A, n, k, P );
	}
	if( fabs( A[k][k] )>TZERO )
	{
		s1 = A[k][k];
		eigv += s1;
		for( i=k; i<n; i++ )
			A[i][i] -= s1;
	}

	return eigv;
}

// Decompose a tridiagonal matrix into an orthogonal matrix and a lower triangular one
// Process the sub-matrix starting with a specified row
int CMatrix::QLdecomp( float** A, int n, int row, float** P )
{
	float *d, *e;
	float *p, *q;
	float *c1, *c2;

	d = new float [n];
	e = new float [n];
	p = new float [n];
	q = new float [n];
	c1 = new float [n];
	c2 = new float [n];

	int i, j;
	for( i=0; i<n; i++ )
		d[i] = A[i][i];
	for( i=0; i<n-1; i++ )
		e[i] = A[i+1][i];

	p[n-1] = d[n-1];
	q[n-2] = e[n-2];

	float** Q;
	Q = allocMat( n );

	identiMat( Q, n );	// initially be an identity matrix

	int flag = 1;	// remains 1 if all off-diagonal elements are 0

	float c, s, t;
	for( int k=n-2; k>=row; k-- )
	{
		if( fabs( e[k] )<TZERO )		// c=1, s=0
		{
			p[k] = d[k];
			if( k>row )
				q[k-1] = e[k-1];

			continue;
		}

		flag = 0;	// at least one off-diagonal element is not 0

		t = -p[k+1]/e[k];
		s = 1/(float)sqrt(1+t*t);
		c = s*t;

		p[k] = c*d[k]+s*q[k];
		if( k>row )
			q[k-1] = c*e[k-1];
		p[k+1] = -s*e[k]+c*p[k+1];
		q[k] = -s*d[k]+c*q[k];

		// update the transform matrix Q
		for( i=row; i<n; i++ )
		{
			c1[i] = c*Q[i][k]+s*Q[i][k+1];	// column k
			c2[i] = -s*Q[i][k]+c*Q[i][k+1];	// column k+1
		}
		for( i=row; i<n; i++ )
		{
			Q[i][k] = c1[i];
			Q[i][k+1] = c2[i];
		}

		// update the transform matrix P
		for( i=0; i<n; i++ )
		{
			c1[i] = c*P[i][k]+s*P[i][k+1];	// column k
			c2[i] = -s*P[i][k]+c*P[i][k+1];	// column k+1
		}
		for( i=0; i<n; i++ )
		{
			P[i][k] = c1[i];
			P[i][k+1] = c2[i];
		}
	}

	// Calculate the transformed matrix A=LQ (symmetric tridiagonal)
	for( i=row; i<n; i++ )
		for( j=row; j<n; j++ )
		{
			if( i-j>1 || j-i>1 )
				A[i][j] = 0;
			else if( i==0 )
				A[i][j] = p[i]*Q[i][j];
			else if( j>=i )
				A[i][j] = q[i-1]*Q[i-1][j]+p[i]*Q[i][j];
			else
				A[i][j] = A[j][i];
		}

	freeMat( Q, n );

	delete d;
	delete e;
	delete p;
	delete q;
	delete c1;
	delete c2;

	return flag;
}

// Tridiagonalization of symmetric matrix by Householder's method
// the transformation matrix is stored in P
void CMatrix::Householder( float** A, int n, float** P )
{
	float *W, *V, *Q;
	float coef;

	W = new float [n];
	V = new float [n];
	Q = new float [n];

	int k, i, j;
	for( k=0; k<n-2; k++ )
	{
		if( reflection( A[k], n, k, W ) )
			continue;

		updateMat( P, W, n, k );	// update the transformation matrix P
		
		matXvec( A, W, n, V );
		coef = innProduct( W, V, n );
		for( i=0; i<n; i++ )
			Q[i] = V[i]-coef*W[i];

		for( i=0; i<n; i++ )
			for( j=0; j<n; j++ )
				A[i][j] = A[i][j]-2*W[i]*Q[j]-2*Q[i]*W[j];
	}

	delete W;
	delete V;
	delete Q;
}

// update the transformation matrix in Housholder
void CMatrix::updateMat( float** P, float* W, int n, int k )
{
	if( k==0 )
	{
		int i, j;
		for( i=1; i<n; i++ )
			for( j=1; j<n; j++ )
				P[i][j] = P[i][j]-2*W[i]*W[j];

		return;
	}

	float* tv;
	tv = new float [n];

	int i, j;
	for( i=0; i<n; i++ )
	{
		tv[i] = 0;
		for( j=k+1; j<n; j++ )
			tv[i] += P[i][j]*W[j];
	}

	for( i=0; i<n; i++ )
		for( j=0; j<n; j++ )
			P[i][j] = P[i][j]-2*tv[i]*W[j];

	delete tv;
}

// Householder reflection of a vector
int CMatrix::reflection( float* X, int n, int k, float* W )
{
	float S2 = 0;
	for( int i=k+1; i<n; i++ )
		S2 += X[i]*X[i];

	if( S2==0 )
		return 1;

	float S;
	S = (float)sqrt( S2 );
	if( X[k+1]<0 )
		S = -S;

	float R2, R;
	R2 = 2*X[k+1]*S+2*S2;
	R = (float)sqrt( R2 );

	for( i=0; i<n; i++ )
	{
		if( i<=k )
			W[i] = 0;
		else if( i==k+1 )
			W[i] = (X[k+1]+S)/R;
		else
			W[i] = X[i]/R;
	}

	return 0;
}

////////////////////////////////////////////////////////////////////////////////
// Elementary matrix and vector operations

float** CMatrix::allocMat( int n )
{
	float** A;
	A = new float* [n];

	for( int i=0; i<n; i++ )
		A[i] = new float [n];

	return A;
}

void CMatrix::freeMat( float** A, int n )
{
	for( int i=0; i<n; i++ )
		delete A[i];
	delete A;
}

// Set a matrix to be identity matrix
void CMatrix::identiMat( float** A, int n )
{
	int i, j;
	for( i=0; i<n; i++ )
		for( j=0; j<n; j++ )
		{
			if( i==j )
				A[i][j] = 1;
			else
				A[i][j] = 0;
		}
}

void CMatrix::transpose( float** A, int n, float** B )
{
	int i, j;
	for( i=0; i<n; i++ )
		for( j=0; j<n; j++ )
			B[i][j] = A[j][i];
}

// matrix-matrix multiplication, result stored in a 3rd matrix
void CMatrix::matXmat( float** A, float** B, int n, float** C )
{
	int i, j, k;
	for( i=0; i<n; i++ )
		for( j=0; j<n; j++ )
		{
			C[i][j] = 0;
			for( k=0; k<n; k++ )
				C[i][j] += A[i][k]*B[k][j];
		}
}

// matrix-matrix multiplication, result overrides the 1st matrix
void CMatrix::matXmat( float** A, float** B, int n )
{
	float* trow;
	trow = new float [n];

	int i, j, k;
	for( i=0; i<n; i++ )
	{
		for( j=0; j<n; j++ )
		{
			trow[j] = 0;
			for( k=0; k<n; k++ )
				trow[j] += A[i][k]*B[k][j];
		}
		memcpy( A[i], trow, n*sizeof(float) );
	}

	delete trow;
}

// matrix-vector multiplication
void CMatrix::matXvec( float** A, float* vect, int n, float* outv )
{
	int i, j;
	for( i=0; i<n; i++ )
	{
		outv[i] = 0;
		for( j=0; j<n; j++ )
			outv[i] += A[i][j]*vect[j];
	}
}

// Outer product of two vectors
void CMatrix::outProduct( float* v1, float* v2, int n, float** A )
{
	int i, j;
	for( i=0; i<n; i++ )
		for( j=0; j<n; j++ )
			A[i][j] = v1[i]*v2[j];
}

// Inner product of two vectors
float CMatrix::innProduct( float* v1, float* v2, int n )
{
	float inp = 0;
	for( int i=0; i<n; i++ )
		inp += v1[i]*v2[i];

	return inp;
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产日韩av一区| 欧美高清在线视频| 国产精品一区在线| 亚洲综合999| 精品1区2区在线观看| 91视频.com| 精品亚洲成av人在线观看| 亚洲三级理论片| 精品国产一区二区亚洲人成毛片| 99久久精品免费精品国产| 久久精品国产精品亚洲精品| 一区二区三区四区激情| 老司机免费视频一区二区| 亚洲欧美综合网| 欧美精品一区二区在线播放| 精品视频免费看| 99久久精品99国产精品 | 天天操天天干天天综合网| 国产精品伦一区| 精品久久久久一区| 欧美巨大另类极品videosbest| av激情综合网| 国产69精品久久久久777| 免费久久99精品国产| 性感美女极品91精品| 亚洲视频精选在线| 国产女人aaa级久久久级 | 懂色av一区二区三区免费看| 青青国产91久久久久久| 亚洲小说春色综合另类电影| 亚洲色图视频免费播放| 国产精品高潮久久久久无| 久久婷婷国产综合精品青草 | 美美哒免费高清在线观看视频一区二区 | 一色桃子久久精品亚洲| 久久九九国产精品| 精品免费视频.| 日韩欧美国产麻豆| 欧美一级国产精品| 日韩一区二区三区免费观看| 制服丝袜在线91| 欧美喷潮久久久xxxxx| 欧美日韩国产美| 欧美日韩美女一区二区| 欧美日韩五月天| 欧美三级日韩三级| 欧美日韩国产免费| 91麻豆精品国产| 日韩欧美自拍偷拍| 欧美v国产在线一区二区三区| 日韩精品一区二区三区三区免费 | 欧美日韩综合一区| 欧美日韩精品一二三区| 91精品国产综合久久福利| 欧美日韩国产一区二区三区地区| 在线不卡欧美精品一区二区三区| 欧美男生操女生| 日韩女优av电影在线观看| 精品国产99国产精品| 国产日韩欧美不卡| 国产精品二三区| 一区二区三区四区不卡视频| 成人av网站在线| 99久久99久久免费精品蜜臀| 91九色02白丝porn| 欧美日韩高清在线| 日韩免费一区二区三区在线播放| 亚洲精品在线观| 中文字幕一区二区三区不卡 | 韩国一区二区在线观看| 成人免费高清在线| 在线欧美日韩精品| 日韩丝袜情趣美女图片| 亚洲国产精品黑人久久久| 亚洲精品成人a在线观看| 日韩av中文在线观看| 国产电影一区在线| 欧美亚洲图片小说| 亚洲精品在线三区| 亚洲蜜臀av乱码久久精品| 日本va欧美va精品发布| 国产一区二区福利视频| 一本久久a久久免费精品不卡| 欧美无砖专区一中文字| 久久综合视频网| 中文字幕一区二区三区乱码在线| 日韩影院免费视频| 国产精品18久久久久久久网站| 日本精品一区二区三区高清| 日韩视频在线你懂得| 国产精品灌醉下药二区| 日韩精品成人一区二区三区| 国产精品一区二区三区99| 欧美亚洲综合网| 久久蜜桃av一区精品变态类天堂| 一区二区三区日韩欧美精品| 欧美一区二区三区喷汁尤物| 国产日本一区二区| 婷婷久久综合九色综合绿巨人| 国产成人免费av在线| 欧美色区777第一页| 国产精品网站在线播放| 日本不卡在线视频| 97久久超碰国产精品| 欧美大胆一级视频| 一级日本不卡的影视| 国产不卡在线播放| 91精品国产免费| 亚洲欧美一区二区三区国产精品| 久久精品理论片| 欧美午夜免费电影| 国产精品久久久久久久午夜片| 免费的成人av| 欧美三级日本三级少妇99| 亚洲欧洲日韩av| 国产精一品亚洲二区在线视频| 欧美精品一级二级三级| 亚洲素人一区二区| 国产**成人网毛片九色 | 欧美日韩国产小视频在线观看| 中文字幕巨乱亚洲| 精品一区二区三区蜜桃| 欧美二区三区的天堂| 一区二区三区国产精华| 成人激情动漫在线观看| 久久久久久久久免费| 麻豆精品一二三| 91精品国产综合久久久久久久久久 | 色综合久久88色综合天天| 国产视频亚洲色图| 狠狠狠色丁香婷婷综合久久五月| 欧美日本一区二区| 亚洲成人tv网| 欧美系列在线观看| 亚洲激情av在线| 色婷婷综合久久| 亚洲精品国产a| 91久久久免费一区二区| 亚洲女同一区二区| 91丝袜高跟美女视频| 国产成人免费在线观看| 日韩免费高清av| 久久99精品久久只有精品| 日韩欧美黄色影院| 激情久久五月天| 久久噜噜亚洲综合| 国产精一品亚洲二区在线视频| 久久婷婷色综合| 高清在线观看日韩| 中文字幕巨乱亚洲| yourporn久久国产精品| 18成人在线视频| 色综合网站在线| 亚洲一区二区三区视频在线| 精品视频一区三区九区| 日韩中文字幕av电影| 欧美久久免费观看| 青青国产91久久久久久| 久久一夜天堂av一区二区三区| 国产在线视视频有精品| 日本一区二区免费在线观看视频 | 欧美色图12p| 日本欧美一区二区三区乱码| 精品美女被调教视频大全网站| 国产一区视频导航| 亚洲视频你懂的| 欧美日韩久久一区二区| 免费在线观看日韩欧美| 久久人人爽爽爽人久久久| av亚洲精华国产精华精| 一区二区三区在线免费播放| 亚洲网友自拍偷拍| 91精品婷婷国产综合久久性色| 国产乱码精品一区二区三区av| 国产精品乱码一区二区三区软件| 色妞www精品视频| 日本一不卡视频| 中文乱码免费一区二区| 欧美性猛交xxxxxxxx| 狠狠色丁香婷婷综合久久片| 亚洲色大成网站www久久九九| 欧美一区二区性放荡片| 成人免费毛片片v| 一区二区三区在线视频观看| 精品国产一区二区在线观看| 99久久久久久| 久久精品国产精品亚洲红杏 | 一区二区三区在线播| 日韩欧美成人激情| 99re这里只有精品视频首页| 日韩经典中文字幕一区| 国产精品久久久久久久久搜平片 | 精品少妇一区二区三区在线播放| 国产91色综合久久免费分享| 亚洲图片一区二区| 国产日产欧美精品一区二区三区| 欧美日韩免费电影| 成人av电影在线播放| 美女视频网站久久| 亚洲免费av在线|