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

📄 print.cpp

📁 fastica C++实现,很简单的,很容易看的
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	clear(vT,c);
	return w;
}

double** whitensignal(double** a,int r, int c)
{
	double** x=zeromean(a,r,c);
	normalize1(x,r,c);
	double** Rx=cov(x,r,c);  
	double* d=new double[c];
	double* e=new double[c];
	householder(Rx,c,d,e);
	ql(Rx,c,d,e);
	permute(Rx,d,c); 

	double** VV=vforwhiten(Rx,d,c);  // whitening matrix
	double** WW=whiten(VV,x,r,c);  // whiten signal

	clear(x,r,c);
	clear(Rx,c);
	delete[]d;
	delete[]e;
	clear(VV,c);
	return WW;
}

double** pca(double** a,int r,int c,double** &E, double* &d)
{	
	double** x=zeromean(a,r,c);
	normalize1(x,r,c);
	E=cov(x,r,c);// Rx->E
	d=new double[c];
	double* e=new double[c];
	householder(E,c,d,e);
	ql(E,c,d,e);
	permute(E,d,c);
	double** YY=mult(x,E,r,c,c);  // PCA signal

	delete[]e;
	clear(x,r,c);

	return YY;
}


double** orthonormalize(double** a,int c)
{
	double** aT=T(a,c);
	aT=mult(a,aT,c);

	double* d=new double[c];
	double* e=new double[c];
	householder(aT,c,d,e);
	ql(aT,c,d,e);// aT=E
	permute(aT,d,c);

	double** ww_1_2=alloc(c);
	for(int i=0;i<c;i++)
	{
		for(int j=0;j<=i;j++)
		{
			ww_1_2[i][j]=0;
			for(int k=0;k<c;k++)
			{
				ww_1_2[i][j]+=aT[i][k]*aT[j][k]/sqrt(d[k]);
			}
			ww_1_2[j][i]=ww_1_2[i][j];
		}
	}

	double** w=mult(ww_1_2,a,c);
	
	clear(aT,c);
	clear(ww_1_2,c);
	delete[]d;
	delete[]e;

	return w;
}


double** orthonormalize(double** a,int r, int c)
{
	double** aT=T(a,r);
	double** E=mult(a,aT,r,c,r);

	double* d=new double[r];
	double* e=new double[r];
	householder(E,r,d,e);
	ql(E,r,d,e);// 
	permute(E,d,r);

	double** ww_1_2=alloc(r);
	for(int i=0;i<r;i++)
	{
		for(int j=0;j<r;j++)
		{
			ww_1_2[i][j]=0;
			for(int k=0;k<c;k++)
			{
				ww_1_2[i][j]+=E[i][k]*E[j][k]/sqrt(d[k]);
			}
		}
	}

	double** w=mult(ww_1_2,a,r,r,c);
	
	clear(aT,c,r);
	clear(ww_1_2,r);
	clear(E,r);
	delete[]d;
	delete[]e;

	return w;
}

double** createrand(int c)
{
	double** a=alloc(c);
	for(int i=0;i<c;i++)
	{
		for(int j=0;j<c;j++)
		{
			a[i][j]=(rand()%1000000)/1000000.0;
		}
	}
	return a;
}


double** createrand(int r,int c)
{
	double** a=alloc(r,c);
	for(int i=0;i<r;i++)
	{
		for(int j=0;j<c;j++)
		{
			a[i][j]=(rand()%1000000)/1000000.0;
		}
	}
	return a;
}


double** createidentical(int r,int c)
{
	double** a=alloc(r,c);
	for(int i=0;i<r;i++)
	{
		for(int j=0;j<c;j++)
		{
			 a[i][j]=0;
		}
	}
	for(i=0;i<r;i++) a[i][i]=1;

	return a;
}

double compare(double** newW,double** oldW, int r, int m)
{
	double d=0;
	double a=0;
	for(int i=0;i<r;i++)
	{
		for(int j=0;j<m;j++)
		{
			d+=(newW[i][j]-oldW[i][j])*(newW[i][j]-oldW[i][j]);
			a+=oldW[i][j]*oldW[i][j];
		}
	}
	return sqrt(d/a/r/m);
}

void setvalue(double** from,double** to, int c)
{
	for(int i=0;i<c;i++)
	{
		for(int j=0;j<c;j++)
		{
			to[i][j]=from[i][j];
		}
	}
}

void setvalue(double** from,double** to,int r, int c)
{
	for(int i=0;i<r;i++)
	{
		for(int j=0;j<c;j++)
		{
			to[i][j]=from[i][j];
		}
	}
}

void orthnor(double** a,int r, int c)
{
	double** b=orthonormalize(a,r,c);
	setvalue(b,a,r,c);
	clear(b,r,c);
}

double g(double x)
{
	//return x*x*x;
	return tanh(x);
}
double gg(double x)
{
	//return 3*x*x;
	double gp=tanh(x);
	return 1-gp*gp;
}

double** G(double** a, int r, int c)
{
	double** ga=alloc(r,c);
	for(int i=0;i<r;i++)
	{
		for(int j=0;j<c;j++)
		{
			ga[i][j]=g(a[i][j]);
		}
	}
	return ga;
}

double** GP(double** a, int r, int c)
{
	double** gga=alloc(r,c);
	for(int i=0;i<r;i++)
	{
		for(int j=0;j<c;j++)
		{
			gga[i][j]=gg(a[i][j]);
		}
	}
	return gga;
}

double** fastica(double** a, int r, int c, int m, double** &neww)
{
	double** z=whitensignal(a,r,c);
	double** oldw=createrand(c,m);
	neww=orthonormalize(oldw,c,m);

	int iter=0;double zelta=0;
	do
	{
		iter++;    
		setvalue(neww,oldw,c,m);

		double** A=mult(z,oldw,r,c,m);
		double** g=  G(A,r,m);
		double** gp=GP(A,r,m);
		
		for(int j=0;j<c;j++)    //  wj = E{z*g(wjT*z)} -E{gp(wjT*z)}*wj
		{
			for(int l=0;l<m;l++)
			{
				neww[j][l]=0;
				for(int i=0;i<r;i++)
				{
					neww[j][l]+=(z[i][j]*g[i][l]-oldw[j][l]*gp[i][l]);
				}
				neww[j][l]/=r;  
			}
		}

		clear(A,r,m);
		clear(g,r,m);
		clear(gp,r,m);

		orthnor(neww,c,m);

		zelta=compare(neww,oldw,c,m);   cout<<iter<<":"<<zelta<<endl;
		
	}while( zelta>1e-7 && iter<1000 ); 

	double** res=mult(z,neww,r,c,m);

	clear(z,r,c);
	clear(oldw,c,m);

	return res;

}

////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////


void testwhitensignal()
{
	int r=100,c=4;
	double** a=readsample("data.txt",r,c);
	write("inputdata输入数据.txt",a,r,c);

	double** x=zeromean(a,r,c);
	write("0mean0均值数据.txt",x,r,c);

	double** x1=normalize(x,r,c);
	write("norm归一化数据.txt",x1,r,c);

	double** Rx=cov(x1,r,c);
	write("Rx归一化数据的关联矩阵.txt",Rx,c);

	double* d=new double[c];
	double* e=new double[c];

	householder(Rx,c,d,e);
	ql(Rx,c,d,e);
	permute(Rx,d,c);

	double** EE=Rx;  // eigenvector matrix
	double* DD=d;    // eigenvalues
	write("EE关联矩阵的本征矢矩阵.txt",EE,c);
	write("DD关联矩阵的本征值.txt",DD,c);

	double** VV=vforwhiten(EE,DD,c);  // whitening matrix
	write("VV白化矩阵.txt",VV,c);

	double** WW=whiten(VV,x1,r,c);  // whiten signal
	write("WW白化矩阵白化的数据.txt",WW,r,c);


	double** YY=mult(x1,EE,r,c,c);  // PCA signal
	write("PCA数据.txt",YY,r,c);

	double** normYY=normalize(YY,r,c);  // normalized PCA signal == whiten signal
	write("PCA数据归一化.txt",normYY,r,c);
	//////////////////////////////////////////////////////////////////////////


	double** ws=whitensignal(a,r,c);
	write("whitesignal函数白化的数据.txt",ws,r,c);
	//////////////////////////////////////////////////////////////////////////

}

void testpca()
{
	int r=100,c=4;
	double** a=readsample("data.txt",r,c);
	double** E=alloc(c);
	double* d=new double[c];
	double** pcad=pca(a,r,c,E,d);
	write("pcadata.txt",pcad,r,c);
	write("pcaE.txt",E,c);
	write("pcad.txt",d,c);
}

void testorth()
{
	int r=10;
	int c=10;
	double** a=createrand(r,c);
	write("orth0.txt",a,r,c);
	write("orth.txt",orthonormalize(a,r,c),r,c);
}

void testfastica()
{	
	int r=100,c=4;
	double** a=readsample("data.txt",r,c);

	int m=4;
	double** neww=NULL;
	double** s=fastica(a,r,c,m,neww);
	write("ica_signall.txt",s,r,m);
	write("WWW.txt",neww,c,m);

}

int main(int argc, char* argv[])
{
	//testwhitensignal();
	//testpca();
	//testorth();
	testfastica();
	return 0;
}


*********************  data.txt   *************************
4.627238406926    3.752335619713    2.877432832500    -2.250438085748 
7.270536476463    9.558582591152    7.771576003051    -0.274960259558 
7.752143168529    9.978679112322    8.529400224987    -0.391417625482 
7.002878912580    6.802325546140    8.083828572249    -1.670058256068 
6.066774374083    3.159137667640    7.478184218484    -3.068620215399 
6.125636313564    2.591104461992    7.893293553817    -3.407747668953 
5.391177135975    1.731541797777    3.534565637893    -4.478836348608 
6.916235163349    5.728677423514    5.463465509035    -3.232781594479 
7.473377089811    6.896691891648    6.445771320731    -2.901337837596 
6.714479858882    4.184405680929    6.131414201699    -3.837492671446 
5.496903810874    0.156398111113    5.375611149057    -5.189244113704 
7.086125870699    2.598453336204    11.446580156735    -3.696912793347 
7.966155225095    4.959010300643    12.815739171367    -2.882667171027 
9.400158092841    9.015944946329    14.748716596833    -1.489835791646 
10.116324018096    10.944381967795    15.971003709309    -0.796974781002 
2.546648719997    5.426816006685    5.432583821384    2.058707621236 
-0.767029145663    -2.710974807355    -1.374097664215    -1.263436950498 
-1.497422923607    -5.105894887464    -1.593706824075    -2.005477065896 
-0.908433351689    -3.556981726227    -0.498023150712    -1.438360123031 
0.508716108666    0.452374918590    1.418952930592    -0.060251992966 
1.496813526808    3.141064915238    2.897302534961    0.864868008078 
3.216265203722    5.978644400175    9.099882705037    2.490882808796 
2.027207352691    2.041884103545    8.374224330016    1.171715765126 
1.166151238932    -0.970386833029    7.959563163193    0.138039136041 
1.583546775691    -0.214386552045    8.804186865746    0.334897204622 
3.059268286666    3.642623911654    10.686002902534    1.537247147465 
2.408953791063    3.043958709411    6.413837787457    0.556348446948 
2.603284660766    2.891288460112    6.966974957493    0.359087184818 
1.723558171665    -0.573407657295    6.420382256811    -0.976412715897 
0.895071220971    -3.977765642535    5.898348956521    -2.327373423246 
-5.726276180054    -7.460453782183    -3.923201854261    0.897989826239 
-4.162591719821    -3.881804506893    -2.108351449981    1.800981263924 
-0.418777603729    4.136549882831    5.863644755630    4.813992494714 
0.323807079973    5.055990773899    6.801421367771    4.755949116847 
-0.134569377199    2.276188109634    6.510705372549    3.428115931885 
-0.833277352261    -1.318591796258    5.952805662877    1.792820737635 
-0.549320875938    -2.056025497075    6.351671219139    1.075442031141 
-0.946465910226    -2.920621204212    2.039693025708    -0.384743557232 
1.115953398650    1.509698848573    4.169125773364    0.556601465930 
2.375275594880    3.455448898764    5.473953218472    0.641078901690 
2.353312381236    1.488800032725    5.477911628961    -0.604688134286 
1.798943874552    -2.136172671593    4.932005329508    -2.426509005559 
3.986408797273    0.408774592335    11.117835328696    -1.544389500769 
5.511094532452    2.923462562775    12.623125542296    -1.356800452202 
7.739015258823    7.512455386933    14.821536427130    -0.491262212340 
2.430681052502    6.862902247291    5.997026072735    3.257182386059 
2.773420613610    5.754053877407    6.298170735662    2.207326819049 
0.307381967313    -1.785065449489    -0.216370436559    -1.655925798285 
0.296363578608    -3.958210771851    -0.269847467170    -3.061698674422 
1.571472614503    -2.259655988268    0.966608021716    -3.171831388712 
3.756665989955    2.192208434342    3.119735455975    -2.355410748906 
5.614499761015    5.694554404670    4.954806246099    -1.843092312853 
8.203690438684    9.430173218649    11.538217510294    -0.569608277969 
7.749187750974    6.087720526013    11.087297759746    -2.303761505439 
7.438490284553    3.235393819729    10.796957608339    -3.852173566987 
8.298594199251    3.961814842891    11.696374148363    -4.182395971639 
10.233762939104    7.986730860257    13.691798518896    -3.385196037751 
12.112418026184    11.921616118208    15.653426436343    -2.587716757419 
10.821810238112    8.436152118815    10.464991194584    -4.898850835935 
10.315660866147    5.390976172290    10.091629559460    -6.361638748463 
2.686775418648    -1.533137021376    -0.857119559109    -4.442964198735 
3.022808769679    -1.862962692708    -0.334355012322    -4.928710740977 
4.555486645497    1.494579748491    1.412892498729    -4.148216659740 
8.318271797833    9.638052224014    9.423346876890    -1.067516551944 
9.084964624288    10.893619271661    10.460603554161    -0.913021981115 
8.528536894138    8.276371976066    10.202324625275    -2.012685590766 
7.520140041385    4.397486222329    9.519010547978    -3.496983387545 
7.316750218738    3.024651039680    9.666711923864    -4.111253096525 
6.382829331755    1.549614773136    5.103639877360    -5.394009538537 
7.964785100933    5.701487572796    7.084878618452    -4.102454222239 
8.788236369205    7.653769099403    8.329304924257    -3.515173242799 
8.261494706272    5.624733169545    8.243327252327    -4.228612810889 
7.029764932243    1.542627275445    7.470045574744    -5.602830226468 
8.376397781390    3.246975632549    13.295585590043    -4.360187571041 
9.016520563571    4.879672878885    14.422512317758    -3.791662807691 
3.482708662571    5.423111849518    5.906645752774    1.066607806251 
4.431340024068    8.044633405757    7.360166366076    1.988854414598 
4.078429823170    6.778834512967    7.517089485029    1.621919630662 
0.807904679767    -1.229806305607    0.753472672742    -1.657292341177 
-0.134754201991    -4.259813090849    0.322086582300    -2.610377127311 
0.184649760512    -3.515948792096    1.149244065036    -2.310197246890 
1.525874514331    0.271303257956    2.991915304046    -1.003964162758 
2.700557181215    3.527322287535    4.659013953358    0.113150577532 
4.691370031712    7.188385136915    11.135640966644    2.017240725899 
3.600601782370    3.557624220561    10.511452357657    0.804313694782 
2.568301970322    0.044370026664    9.929189731843    -0.391501034345 
2.700221143372    -0.041823639750    10.492404254610    -0.469951369668 
4.037916987368    3.416687154625    12.240645290594    0.605499571635 
5.522627973420    7.237329070506    14.113354524446    1.771598294520 
3.986716589395    3.914235345649    8.936267418847    -0.143210049666 
-3.701451505488    -2.560974597852    -1.892692577873    2.163861275760 
-4.650035524012    -6.306377538263    -2.529324017902    0.706550820811 
-4.598310715704    -7.146363747858    -2.192935131007    0.181327942920 
-3.225894428952    -4.121582549916    -0.563656773610    0.907291523621 
0.591992608461    4.138968532502    7.488120332960    4.008645624826 
1.596695178454    5.864578834440    8.693676474819    4.226874241820 
1.335155181728    3.694737117708    8.605354530384    3.109771493157 
0.575953187755    -0.062635760959    7.992357682933    1.427474482823 
0.591236433633    -1.587955113663    8.127731162877    0.454375431203 
-0.038360699740    -3.132712988198    3.588213478893    -1.225980734928

⌨️ 快捷键说明

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