44 const QSharedPointer<MatrixXd> matDistanceTable,
45 double (*interpolationFunction) (
double),
46 const double dCancelDist,
47 const VectorXi &vecExcludeIndex)
49 if(matDistanceTable->rows() == 0 && matDistanceTable->cols() == 0) {
50 qDebug() <<
"[WARNING] Interpolation::createInterpolationMat - received an empty distance table.";
51 return QSharedPointer<SparseMatrix<float> >::create();
54 QSharedPointer<Eigen::SparseMatrix<float> > matInterpolationMatrix = QSharedPointer<SparseMatrix<float> >::create(matDistanceTable->rows(),
static_cast<int>(vecProjectedSensors.size()));
56 QVector<Triplet<float> > vecNonZeroEntries;
57 const qint32 iRows = matInterpolationMatrix->rows();
58 const qint32 iCols = matInterpolationMatrix->cols();
61 std::unordered_set<int> excludeSet;
62 for(Eigen::Index i = 0; i < vecExcludeIndex.size(); ++i) {
63 excludeSet.insert(vecExcludeIndex[i]);
66 QSet<qint32> sensorLookup;
67 for(Eigen::Index idx = 0; idx < vecProjectedSensors.size(); ++idx){
68 if(excludeSet.count(
static_cast<int>(idx)) == 0){
69 sensorLookup.insert(vecProjectedSensors[idx]);
73 for (qint32 r = 0; r < iRows; ++r) {
74 if (sensorLookup.contains(r) ==
false) {
75 QVector<QPair<qint32, float> > vecBelowThresh;
76 float dWeightsSum = 0.0;
77 const RowVectorXd& rowVec = matDistanceTable->row(r);
79 for (qint32 c = 0; c < iCols; ++c) {
80 const float dDist = rowVec[c];
82 if (dDist < dCancelDist) {
83 const float dValueWeight = std::fabs(1.0 / interpolationFunction(dDist));
84 dWeightsSum += dValueWeight;
85 vecBelowThresh.push_back(qMakePair(c, dValueWeight));
89 for (
const QPair<qint32, float> &qp : vecBelowThresh) {
90 vecNonZeroEntries.push_back(Eigen::Triplet<float> (r, qp.first, qp.second / dWeightsSum));
94 int iIndexInSubset = 0;
95 for(Eigen::Index k = 0; k < vecProjectedSensors.size(); ++k) {
96 if(vecProjectedSensors[k] == r) {
97 iIndexInSubset =
static_cast<int>(k);
101 vecNonZeroEntries.push_back(Eigen::Triplet<float> (r, iIndexInSubset, 1));
105 matInterpolationMatrix->setFromTriplets(vecNonZeroEntries.begin(), vecNonZeroEntries.end());
107 return matInterpolationMatrix;
static Eigen::VectorXf interpolateSignal(const QSharedPointer< Eigen::SparseMatrix< float > > matInterpolationMatrix, const QSharedPointer< Eigen::VectorXf > &vecMeasurementData)
interpolateSignal Interpolates sensor data using the weight matrix (shared pointer version).
static QSharedPointer< Eigen::SparseMatrix< float > > createInterpolationMat(const Eigen::VectorXi &vecProjectedSensors, const QSharedPointer< Eigen::MatrixXd > matDistanceTable, double(*interpolationFunction)(double), const double dCancelDist=FLOAT_INFINITY, const Eigen::VectorXi &vecExcludeIndex=Eigen::VectorXi())
createInterpolationMat Calculates the weight matrix for interpolation.