void BSpline::setCoefficients(const DenseVector &coefficients) { if (coefficients.size() != getNumBasisFunctions()) throw Exception("BSpline::setControlPoints: Incompatible size of coefficient vector."); this->coefficients = coefficients; checkControlPoints(); }
BSpline::BSpline(DenseVector coefficients, std::vector<std::vector<double>> knotVectors, std::vector<unsigned int> basisDegrees) : Function(knotVectors.size()), basis(BSplineBasis(knotVectors, basisDegrees)), coefficients(coefficients), knotaverages(computeKnotAverages()) { setCoefficients(coefficients); checkControlPoints(); }
/* * Constructors for multivariate B-spline using explicit data */ BSpline::BSpline(std::vector<std::vector<double>> knotVectors, std::vector<unsigned int> basisDegrees) : Function(knotVectors.size()), basis(BSplineBasis(knotVectors, basisDegrees)), coefficients(DenseVector::Zero(1)), knotaverages(computeKnotAverages()) { // Initialize coefficients to ones setCoefficients(DenseVector::Ones(basis.getNumBasisFunctions())); checkControlPoints(); }
void BSpline::setControlPoints(const DenseMatrix &controlPoints) { if (controlPoints.cols() != numVariables + 1) throw Exception("BSpline::setControlPoints: Incompatible size of control point matrix."); int nc = controlPoints.rows(); knotaverages = controlPoints.block(0, 0, nc, numVariables); coefficients = controlPoints.block(0, numVariables, nc, 1); checkControlPoints(); }
PSpline::PSpline(const DataTable &samples, double lambda) : lambda(lambda) { // Check data assert(samples.isGridComplete()); std::vector< std::vector<double> > xdata = samples.getTableX(); numVariables = samples.getNumVariables(); // Assuming a cubic spline std::vector<unsigned int> basisDegrees(samples.getNumVariables(), 3); basis = BSplineBasis(xdata, basisDegrees, KnotVectorType::FREE); computeControlPoints(samples); init(); checkControlPoints(); }