docs: public boolean threeView(DMatrixRMaj F21 , DMatrixRMaj F31 , DMatrixRMaj F32 ,
  							 DMatrixRMaj P2 , DMatrixRMaj P3)
  	{
  		// left epipoles. renamed to make code easier to read
  		Point3D_F64 e21 = e1;
  		Point3D_F64 e31 = e2;
  
  		alg.process(F21,null,e21);
  		twoView(F21,e21,zero,1,P2);
  		alg.process(F31,null,e31);
  
  		// find transform which will make P2 = [I|0]
  		if( !p2i.process(P2) )
  			return false;
  
  		// Perform non-linear optimization to find the parameters for u and minimize the difference
  		residual.setF31(F31,e31);
  		residual.setF32(F32);
  		residual.setH(p2i.getPseudoInvP(),p2i.getU());
  
  //		optimizer.setVerbose(System.out,0);
  		optimizer.setFunction(residual,jacobian);
  		optimizer.initialize(initialV,convergence.ftol,convergence.gtol);
  		for (int i = 0; i < convergence.maxIterations; i++) {
  			if( optimizer.iterate())
  				break;
  		}
  
  		P3.set(residual.computeP3(optimizer.getParameters()));
  
  //		// used to sanity check the found solution
  //		double err[] = new double[9];
  //		residual.process(optimizer.getParameters(),err);
  //		residual.F32.print();
  //		residual.F32_est.print();
  
  		return true;
  	}