gaussian_model EMclustering::maximization(MatrixXf x, MatrixXf r) { int d = x.rows(); int n = x.cols(); int k = r.cols(); //cerr<<x<<endl; VectorXf nk(r.rows()); nk = r.colwise().sum(); VectorXf w(nk.size()); w = nk/n; MatrixXf tmp1(x.rows(),r.cols()); tmp1 = x * r; VectorXf tmp2(nk.size()); tmp2 = nk.array().inverse(); //cerr<<tmp2<<endl<<endl; MatrixXf mu(x.rows(),r.cols()); mu = tmp1 * tmp2.asDiagonal() ; MatrixXf *sigma = new MatrixXf[k]; for(int i=0;i<k;i++) sigma[i].setZero(d,d); MatrixXf sqrtr(r.rows(),r.cols()); sqrtr = r.cwiseSqrt(); MatrixXf xo(d,n); MatrixXf tmp3(d,d); tmp3.setIdentity(d,d); for(int i=0;i<k;i++) { xo = x.colwise() - mu.col(i); VectorXf tmp4(sqrtr.rows()); tmp4 = sqrtr.col(i); tmp4 = tmp4.adjoint(); xo = xo* tmp4.asDiagonal(); sigma[i] = xo*xo.adjoint()/nk(i); sigma[i] = sigma[i] + tmp3*1e-6; //cerr<<sigma[i]<<endl<<endl; } gaussian_model model; model.mu = mu; model.sigma = new MatrixXf[k]; for(int i=0;i<k;i++) model.sigma[i] = sigma[i]; model.weight = w; nk.resize(0); w.resize(0); tmp1.resize(0,0); tmp2.resize(0); tmp3.resize(0,0); mu.resize(0,0); for(int i=0;i<k;i++) sigma[i].resize(0,0); delete [] sigma; sqrtr.resize(0,0); xo.resize(0,0); tmp3.resize(0,0); //cerr<<"---"<<endl; model.weight = model.weight.adjoint(); //cerr<<model.weight<<endl<<endl; //cerr<<model.mu<<endl<<endl; //for(int i=0;i<k;i++) //{ // cerr<<model.sigma[i]<<endl<<endl; //} return model; }