Esempio n. 1
0
void FactorAnalysisStat::estimateAndInverseLUnThreaded(){
	if (verbose) cout << "(FactorAnalysisStat) Inverse L Matrix ... "<<endl;	
	unsigned long mk;
	DoubleSquareMatrix L(_rang);	
	L.setAllValues(0.0);
	RealVector <double> AUX;
	AUX.setSize(_rang);
	unsigned long sent=0;
	XLine *pline;
	String *pFile;
	fileList.rewind();

	double *N_h=_matN_h.getArray(); 
	double *U=_matU.getArray();
	double *LV=L.getArray();
	double *super_invvar=_super_invvar.getArray();
	
	while((pline=fileList.getLine())!=NULL) {
		while((pFile=pline->getElement())!=NULL) {
			L.setAllValues(0.0);
			AUX.setAllValues(0.0);
			for(unsigned long i=0;i<_rang;i++){
				for(unsigned long j=0;j<=i;j++){
					for(unsigned long k=0;k<_supervsize;k++){
						mk=k/_vsize;
						LV[i*_rang+j]+=N_h[sent*_mixsize+mk]*super_invvar[k]*U[k*_rang+i]*U[k*_rang+j];
						}
					}
				}
			for(unsigned long i=0;i<_rang;i++)
				for(unsigned long j=i+1;j<_rang;j++) 
					LV[i*_rang+j]=LV[j*_rang+i];
				
			for(unsigned long i=0;i<_rang;i++) 
				LV[i*_rang+i]+=1.0;
			L.invert(_l_h_inv[sent]);	
			sent++;
		}
	}
};
Esempio n. 2
0
void FactorAnalysisStat::getUEstimateUnThreaded(){
	if (verbose) cout << "(FactorAnalysisStat) Compute U Estimate "<<endl;	
	DoubleSquareMatrix L(_rang);
	DoubleSquareMatrix L_Inv(_rang);
	RealVector <double> R;
	R.setSize(_rang);

	double *N_h=_matN_h.getArray(); 
	double *X=_matX.getArray();
	double *S_X_h=_matS_X_h.getArray();
	double *U=_matU.getArray();
	double *RV=R.getArray();
	double *LV=L.getArray();

	/*for(i=0;i<_supervsize;i++){
		unsigned long im=i/_vsize;
		L.setAllValues(0.0);
		R.setAllValues(0.0);
		for(j=0;j<_nb_sent;j++){
			double *l_h_inv=_l_h_inv[j].getArray();
			for(k=0;k<_rang;k++){
				for(l=0;l<_rang;l++) 
					LV[k*_rang+l]+=(l_h_inv[k*_rang+l]+X[j*_rang+k]*X[j*_rang+l])*N_h[j*_mixsize+im];
				RV[k]+=S_X_h[j*_supervsize+i]*X[j*_rang+k];
				}
			}		
		L.invert(L_Inv);
		double *L_InvV=L_Inv.getArray();
		for(j=0;j<_rang;j++)
			U[i*_rang+j]=0.0;
		for(j=0;j<_rang;j++)
			for(k=0;k<_rang;k++) 
				U[i*_rang+j]+=L_InvV[j*_rang+k]*RV[k];
	}*/
	_matU.setAllValues(0.0);
	for(unsigned long g=0;g<_mixsize;g++){		
		L.setAllValues(0.0);
		// Estimate LU for the gaussian g
		for(unsigned long j=0;j<_nb_sent;j++){
			double *l_h_inv=_l_h_inv[j].getArray();
			for(unsigned long k=0;k<_rang;k++)
				for(unsigned long l=0;l<_rang;l++) 
					LV[k*_rang+l]+=(l_h_inv[k*_rang+l]+X[j*_rang+k]*X[j*_rang+l])*N_h[j*_mixsize+g];
		}
		L.invert(L_Inv); 
		double *L_InvV=L_Inv.getArray();	
		
		// Estimate LU for the line lineNum
		for (unsigned long i=0;i<_vsize;i++) {
			unsigned long lineNum=_vsize*g+i;			
			// estime RU i
			R.setAllValues(0.0);
			for(unsigned long j=0;j<_nb_sent;j++)
				for(unsigned long k=0;k<_rang;k++)
					RV[k]+=S_X_h[j*_supervsize+lineNum]*X[j*_rang+k];
			// estime U i
			for(unsigned long j=0;j<_rang;j++)
				for(unsigned long k=0;k<_rang;k++) 
					U[lineNum*_rang+j]+=L_InvV[j*_rang+k]*RV[k];
		}
	}	
};