66 const QSharedPointer<MatrixXd> matDistanceTable,
67 double (*interpolationFunction) (
double),
68 const double dCancelDist,
69 const VectorXi &vecExcludeIndex)
71 if(matDistanceTable->rows() == 0 && matDistanceTable->cols() == 0) {
72 qDebug() <<
"[WARNING] Interpolation::createInterpolationMat - received an empty distance table.";
73 return QSharedPointer<SparseMatrix<float> >::create();
76 QSharedPointer<Eigen::SparseMatrix<float> > matInterpolationMatrix = QSharedPointer<SparseMatrix<float> >::create(matDistanceTable->rows(),
static_cast<int>(vecProjectedSensors.size()));
78 QVector<Triplet<float> > vecNonZeroEntries;
79 const qint32 iRows = matInterpolationMatrix->rows();
80 const qint32 iCols = matInterpolationMatrix->cols();
83 std::unordered_set<int> excludeSet;
84 for(Eigen::Index i = 0; i < vecExcludeIndex.size(); ++i) {
85 excludeSet.insert(vecExcludeIndex[i]);
88 QSet<qint32> sensorLookup;
89 for(Eigen::Index idx = 0; idx < vecProjectedSensors.size(); ++idx){
90 if(excludeSet.count(
static_cast<int>(idx)) == 0){
91 sensorLookup.insert(vecProjectedSensors[idx]);
95 for (qint32 r = 0; r < iRows; ++r) {
96 if (sensorLookup.contains(r) ==
false) {
97 QVector<QPair<qint32, float> > vecBelowThresh;
98 float dWeightsSum = 0.0;
99 const RowVectorXd& rowVec = matDistanceTable->row(r);
101 for (qint32 c = 0; c < iCols; ++c) {
102 const float dDist = rowVec[c];
104 if (dDist < dCancelDist) {
105 const float dValueWeight = std::fabs(1.0 / interpolationFunction(dDist));
106 dWeightsSum += dValueWeight;
107 vecBelowThresh.push_back(qMakePair(c, dValueWeight));
111 for (
const QPair<qint32, float> &qp : vecBelowThresh) {
112 vecNonZeroEntries.push_back(Eigen::Triplet<float> (r, qp.first, qp.second / dWeightsSum));
116 int iIndexInSubset = 0;
117 for(Eigen::Index k = 0; k < vecProjectedSensors.size(); ++k) {
118 if(vecProjectedSensors[k] == r) {
119 iIndexInSubset =
static_cast<int>(k);
123 vecNonZeroEntries.push_back(Eigen::Triplet<float> (r, iIndexInSubset, 1));
127 matInterpolationMatrix->setFromTriplets(vecNonZeroEntries.begin(), vecNonZeroEntries.end());
129 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.