docs: void constructLinearSystem(List<DMatrixRMaj> homographies,
  							   List<List<PointIndex2D_F64>> observations) {
  		// parameters are encoded points first then the
  		int startView = totalFeatures*3;
  
  		A.reshape(numEquations,numUnknown);
  
  		DMatrixRMaj H = new DMatrixRMaj(3,3);
  		Point2D_F64 p = new Point2D_F64();
  
  		int row = 0;
  		for (int viewIdx = 0; viewIdx < homographies.size(); viewIdx++) {
  			N.apply(homographies.get(viewIdx),H);
  
  			int colView = startView + viewIdx*3;
  
  			List<PointIndex2D_F64> obs = observations.get(viewIdx);
  			for (int i = 0; i < obs.size(); i++) {
  				PointIndex2D_F64 p_pixel = obs.get(i);
  
  				N.apply(p_pixel,p);
  
  				// column this feature is at
  				int col = p_pixel.index*3;
  
  				// x component of pixel
  				// A(row,colView) =  ...
  				A.data[row*A.numCols + col    ] = p.x*H.get(2,0) - H.get(0,0);
  				A.data[row*A.numCols + col + 1] = p.x*H.get(2,1) - H.get(0,1);
  				A.data[row*A.numCols + col + 2] = p.x*H.get(2,2) - H.get(0,2);
  
  				A.data[row*A.numCols + colView     ] = -1;
  				A.data[row*A.numCols + colView + 1 ] = 0;
  				A.data[row*A.numCols + colView + 2 ] = p.x;
  
  				// y component of pixel
  				row += 1;
  				A.data[row*A.numCols + col    ] = p.y*H.get(2,0) - H.get(1,0);
  				A.data[row*A.numCols + col + 1] = p.y*H.get(2,1) - H.get(1,1);
  				A.data[row*A.numCols + col + 2] = p.y*H.get(2,2) - H.get(1,2);
  
  				A.data[row*A.numCols + colView     ] = 0;
  				A.data[row*A.numCols + colView + 1 ] = -1;
  				A.data[row*A.numCols + colView + 2 ] = p.y;
  
  				row += 1;
  			}
  		}
  	}