Eigen::SparseVector<double> normProbVector(Eigen::SparseVector<double> P_vec) { VectorXd P_dense_vec = (VectorXd)P_vec; Eigen::SparseVector<double> P_norm; if (P_dense_vec == VectorXd::Zero(P_vec.size())) { P_norm = P_vec; } else{ double P_positive = 0; double P_negative = 0; for (int row_idx = 0; row_idx < P_vec.size(); row_idx++){ P_positive = (P_vec.coeff(row_idx) > 0) ? (P_positive + P_vec.coeff(row_idx)) : P_positive; P_negative = (P_vec.coeff(row_idx) > 0) ? P_negative : (P_negative + P_vec.coeff(row_idx)); } if (fabs(P_positive) < fabs(P_negative)){ P_norm = -P_vec / fabs(P_negative); } else{ P_norm = P_vec / fabs(P_positive); } for (int row_idx = 0; row_idx < P_vec.size(); row_idx++){ P_norm.coeffRef(row_idx) = (P_norm.coeff(row_idx)<0) ? 0 : P_norm.coeff(row_idx); } } P_norm.prune(TOLERANCE); return P_norm; }
Eigen::SparseVector<double> pinv_vector(Eigen::SparseVector<double> pinvvec) { Eigen::SparseVector<double> singularValues_inv; singularValues_inv.resize(pinvvec.size()); for (int i = 0; i<pinvvec.size(); ++i) { singularValues_inv.coeffRef(i) = (fabs(pinvvec.coeff(i)) > TOLERANCE) ? 1.0 / pinvvec.coeff(i) : 0; } singularValues_inv.prune(TOLERANCE); return singularValues_inv; }
IGL_INLINE void igl::diag( const Eigen::SparseVector<T>& V, Eigen::SparseMatrix<T>& X) { // clear and resize output Eigen::DynamicSparseMatrix<T, Eigen::RowMajor> dyn_X(V.size(),V.size()); dyn_X.reserve(V.size()); // loop over non-zeros for(typename Eigen::SparseVector<T>::InnerIterator it(V); it; ++it) { dyn_X.coeffRef(it.index(),it.index()) += it.value(); } X = Eigen::SparseMatrix<T>(dyn_X); }