Пример #1
0
Eigen::MatrixXd    MyMath::my_Rv_2_RM(   Eigen::MatrixXd rvvv   )  // rv(3,1);   // Exponential Map - so(3)=>SO(3)     //   IGNORE T !!!!!!!!!!!!!!!!!! (zero pitch screw)
{

        Eigen::MatrixXd RRR(3,3);

        double theta = rvvv.norm();

        Eigen::MatrixXd I3 = Eigen::MatrixXd::Identity(3,3);

        Eigen::MatrixXd W(     3,1 );
        Eigen::MatrixXd W_hat( 3,3 );  // Wmega Hat


        double              thresh_shouldBeZero = 0.00009;
        if (theta < (double)thresh_shouldBeZero)
        {
                RRR = I3;
        }
        else
        {
                W = rvvv / theta;

                W_hat <<  0,     -W(2),   W(1),  // Wmega Hat
                          W(2),   0,     -W(0),
                         -W(1),   W(0),   0;

                RRR = I3 + W_hat*(double)qSin(theta) + (W_hat*W_hat)*(double)(1.0-qCos(theta)); // Rodrigues!!!
        }

        ///////////
        return RRR;
        ///////////

}
Пример #2
0
  void createCostMatrix()
  {
    int reps = 1; // 10 = 1.71s / 1.8s  (0.17 / 0.18 seconds for dense matrix mult)

    //ros::WallTime start = ros::WallTime::now();
    {
      boost::progress_timer t;
      for (int i=0; i<reps; ++i)
        dense_R = dense_A.transpose() * dense_A;

      printf("%d reps of dense matrix multiplication: ", reps);
    }

    reps = 1; // 10000 = 0.5s / 0.83s     (50us / 83us for sparse matrix mult)
    {
      boost::progress_timer t;
      for (int i=0; i<reps; ++i)
        sparse_R = sparse_A.transpose() * sparse_A;

      printf("%d reps of sparse matrix multiplication: ", reps);
    }

    Eigen::MatrixXd temp = sparse_R;
    Eigen::MatrixXd diff = dense_R - temp;
    printf("Error norm = %f\n", diff.norm());
  }
Пример #3
0
void BranchList::calculateOrientations()
{
	for (int i = 0; i < mBranches.size(); i++)
	{
		Eigen::MatrixXd positions = mBranches[i]->getPositions();
		Eigen::MatrixXd diff = positions.rightCols(positions.cols() - 1) - positions.leftCols(positions.cols() - 1);
		Eigen::MatrixXd orientations(positions.rows(),positions.cols());
		orientations.leftCols(orientations.cols() - 1) = diff / diff.norm();
		orientations.rightCols(1) = orientations.col(orientations.cols() - 1);
		mBranches[i]->setOrientations(orientations);
	}
}
Пример #4
0
void analyzeRank(const std::string inputMatrixFileName,const std::string inputGraphFileName,const std::string outputFileName,const int input_Min_i,const int input_Min_j, const int input_NumRows,const int input_NumCols,std::string mode){
  Eigen::MatrixXd inputMatrix = readBinaryIntoMatrixXd(inputMatrixFileName);
  Eigen::SparseMatrix<double> inputGraph = readMtxIntoSparseMatrix(inputGraphFileName);
  int min_i,min_j,numRows,numCols;
  int matrixSize = inputMatrix.rows();
  if (mode == "topOffDiag"){  
    int split = matrixSize/2; 
    min_i = 0;
    min_j = split + 1;
    numRows = split + 1;
    numCols = matrixSize - split - 1;
  } else if (mode == "bottOffDiag"){  
    int split = matrixSize/2; 
    min_i = split + 1;
    min_j = 0;
    numRows = matrixSize - split - 1;
    numCols = split + 1; 
  }else{
    min_i   = input_Min_i;
    min_j   = input_Min_j;
    numRows = input_NumRows;
    numCols = input_NumCols;
  }
  int currRank  = 0;
  int currRankComp1 = 0;
  int currRankComp3 = 0;
  int currRankComp5 = 0;
  int nextRank  = -1;
  int depth     = 0;
  Eigen::MatrixXd currBlock = inputMatrix.block(min_i,min_j,numRows,numCols);
  Eigen::MatrixXd U,V;
  std::vector<double> numPoints,boundaryError,SVDError,singularValues;
  std::vector<double> boundaryErrorComp1,boundaryErrorComp3,boundaryErrorComp5;
  while (currRank != nextRank){
    nextRank = currRank;
    PS_Boundary_LowRankApprox(inputMatrix,inputGraph,U,V,min_i,min_j,numRows,numCols,1e-15,currRank,depth);
    numPoints.push_back(currRank);
    double relError = (U * V.transpose() - currBlock).norm()/currBlock.norm();

    boundaryError.push_back(relError);
    PS_Boundary_LowRankApprox(inputMatrix,inputGraph,U,V,min_i,min_j,numRows,numCols,1e-1,currRankComp1,depth);
    relError = (U * V.transpose() - currBlock).norm()/currBlock.norm();
    
    boundaryErrorComp1.push_back(relError);
    PS_Boundary_LowRankApprox(inputMatrix,inputGraph,U,V,min_i,min_j,numRows,numCols,1e-3,currRankComp3,depth);
    relError = (U * V.transpose() - currBlock).norm()/currBlock.norm();
    
    boundaryErrorComp3.push_back(relError);
    PS_Boundary_LowRankApprox(inputMatrix,inputGraph,U,V,min_i,min_j,numRows,numCols,1e-5,currRankComp5,depth);
    relError = (U * V.transpose() - currBlock).norm()/currBlock.norm();
  
    boundaryErrorComp5.push_back(relError);
    depth ++;
  }
  saveVectorAsText(outputFileName + "numPointsVsBoundaryDistance",numPoints);
  saveVectorAsText(outputFileName + "boundaryErrorVsBoundaryDistance",boundaryError);
  saveVectorAsText(outputFileName + "boundaryErrorCompVsBoundaryDistance1",boundaryErrorComp1);
  saveVectorAsText(outputFileName + "boundaryErrorCompVsBoundaryDistance3",boundaryErrorComp3);
  saveVectorAsText(outputFileName + "boundaryErrorCompVsBoundaryDistance5",boundaryErrorComp5);

  // Use svd to calculate the optimal low-rank approximation error
  Eigen::JacobiSVD<Eigen::MatrixXd> svd(currBlock,Eigen::ComputeThinU|Eigen::ComputeThinV);
  Eigen::VectorXd s = svd.singularValues();
  for (unsigned int i = 0; i < s.rows(); i++)
    singularValues.push_back(s(i));

  for (unsigned int i = 0; i < numPoints.size(); i++){
    int rank = numPoints[i];
    U = svd.matrixU().leftCols(rank);
    V = svd.matrixV().leftCols(rank);
    Eigen::MatrixXd K = Eigen::MatrixXd::Zero(rank,rank);
    for (int j = 0; j < rank; j++)
      K(j,j) = singularValues[j];
    double relError = (U * K * V.transpose() - currBlock).norm()/currBlock.norm();
    SVDError.push_back(relError);
  }
  saveVectorAsText(outputFileName + "SVDErrorVsBoundaryDistance",SVDError);
  saveVectorAsText(outputFileName + "SingularValueDecay",singularValues);

  // Calculate distance from boundary vs pivot size
  PS_Boundary_LowRankApprox(inputMatrix,inputGraph,U,V,min_i,min_j,numRows,numCols,1e-15,currRank,matrixSize,outputFileName + "distanceFromBoundaryVsPivotSize");

}