//update random Vectors void updateMatrix(Eigen::SparseMatrix<double,Eigen::RowMajor>& randomMatrix, const Eigen::SparseMatrix<int,Eigen::RowMajor>& adjacencyMatrix, int itr) { int numberOfRVector = randomMatrix.rows(); int numberOfVertice = randomMatrix.cols(); std::vector<double> rowSum = getRowSum(adjacencyMatrix); for(int i=0; i<numberOfRVector;++i){ for(int h=0;h<itr;++h){ Eigen::SparseMatrix<double,Eigen::RowMajor> middleValueMatrix(numberOfVertice,1); middleValueMatrix.reserve(1); for(int j = 0; j<numberOfVertice; ++j){ Eigen::SparseMatrix<double,Eigen::RowMajor> v1(1,numberOfVertice), v2(numberOfVertice,1); v1.reserve(numberOfVertice); v2.reserve(1); v1 = adjacencyMatrix.cast<double>().innerVector(j); v2 = randomMatrix.innerVector(h).transpose(); Eigen::SparseMatrix<double,Eigen::RowMajor> middleValue1 = v1*v2; double middleValue = 0; if(rowSum[j] != 0){ middleValue = (*middleValue1.valuePtr())/rowSum[j]; } else { middleValue = 1; } middleValueMatrix.insert(j,0) = middleValue; } Eigen::SparseMatrix<double,Eigen::RowMajor> right = middleValueMatrix.transpose(); Eigen::SparseMatrix<double,Eigen::RowMajor> left = randomMatrix.innerVector(i); randomMatrix.innerVector(i) = 0.5*(left + right); } } }
std::vector<double> getRowSum(const Eigen::SparseMatrix<int,Eigen::RowMajor>& adjacencyMatrix) { int rowSize = adjacencyMatrix.rows(); std::vector<double> rowSum; rowSum.reserve(rowSize); for(int i=0; i<rowSize;++i){ double value = adjacencyMatrix.innerVector(i).sum(); rowSum.push_back(value); } return rowSum; }