Exemplo n.º 1
0
  arma::vec polynomial(
      const arma::vec& parameter,
      const arma::uword highestDegree) {
    if (parameter.n_elem == 0 || highestDegree == 0) {
      // By definition, the constant term is 1.
      return {1.0};
    }

    arma::vec polynomial(polynomialSize(parameter.n_elem, highestDegree));
    arma::uword n = 0;
    // Generates all terms for degree > 1
    for (arma::uword degree = highestDegree; degree >= 2; --degree) {
      for (const auto& multicombination : multicombinations(parameter.n_elem, degree)) {
        const arma::vec& partialParameter = parameter.elem(multicombination);

        polynomial(n++) = arma::prod(partialParameter);
      }
    }
    // Linear term
    polynomial.subvec(n, n + parameter.n_elem - 1) = parameter;
    // By definition, the constant term is 1.
    polynomial(polynomial.n_elem - 1) = 1;

    return polynomial;
  }
Exemplo n.º 2
0
arma::Col<double> polynomial(
    const arma::Col<double>& parameter,
    const arma::uword polynomialOrder) {
    arma::Col<double> polynomial(polynomialSize(parameter.n_elem, polynomialOrder));

    // For any polynomial, all constant terms are 1.
    switch (polynomialOrder) {
    case 0: { // Constant polynomials
        // Constant term
        polynomial(0) = 1.0;
    }
    break;
    case 1: { // Linear polynomials
        // Linear term
        polynomial.head(parameter.n_elem) = parameter;
        // Constant term
        polynomial(parameter.n_elem) = 1;
    }
    break;
    case 2: { // Quadratic polynomials
        // Quadratic term
        arma::uword n = 0;
        for (arma::uword k = 0; k < parameter.n_elem; ++k) {
            for (arma::uword l = k; l < parameter.n_elem; ++l) {
                polynomial(n++) = parameter(k) * parameter(l);
            }
        }
        // Linear term
        polynomial.subvec(n, n + parameter.n_elem - 1) = parameter;
        // Constant term
        polynomial(polynomial.n_elem - 1) = 1;
    }
    break;
    case 3: { // Cubic polynomials
        // Cubic term
        arma::uword n = 0;
        for (arma::uword k = 0; k < parameter.n_elem; ++k) {
            for (arma::uword l = k; l < parameter.n_elem; ++l) {
                for (arma::uword m = l; m < parameter.n_elem; ++m) {
                    polynomial(n++) = parameter(k) * parameter(l) * parameter(m);
                }
            }
        }
        // Quadratic term
        for (arma::uword k = 0; k < parameter.n_elem; ++k) {
            for (arma::uword l = k; l < parameter.n_elem; ++l) {
                polynomial(n++) = parameter(k) * parameter(l);
            }
        }
        // Linear term
        polynomial.subvec(n, n + parameter.n_elem - 1) = parameter;
        // Constant term
        polynomial(polynomial.n_elem - 1) = 1;
    }
    break;
    default: { // Polynomials of degree >= 4
        // All terms, expect the linear and constant one.
        arma::uword n = 0;
        // Generates the term for all degrees > 1
        for (arma::uword d = 2; d <= polynomialOrder; ++d) {
            for (const auto& multicombination : multicombinations(parameter.n_elem, d)) {
                polynomial(n++) = arma::prod(parameter.elem(multicombination));
            }
        }
        // Linear term
        polynomial.subvec(n, n + parameter.n_elem - 1) = parameter;
        // Constant term
        polynomial(polynomial.n_elem - 1) = 1;
    }
    break;
    }

    return polynomial;
}