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++; } } };
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]; } } };