// NOTE: does not pass tests SparseMatrix BSplineBasis::evalBasisJacobian(DenseVector &x) const { // Jacobian basis matrix SparseMatrix J(getNumBasisFunctions(), numVariables); //J.setZero(numBasisFunctions(), numInputs); // Calculate partial derivatives for (unsigned int i = 0; i < numVariables; ++i) { // One column in basis jacobian std::vector<SparseVector> values(numVariables); for (unsigned int j = 0; j < numVariables; ++j) { if (j == i) { // Differentiated basis values.at(j) = bases.at(j).evaluateDerivative(x(j),1); } else { // Normal basis values.at(j) = bases.at(j).evaluate(x(j)); } } SparseVector Ji = kroneckerProductVectors(values); // Fill out column for (int k = 0; k < Ji.outerSize(); ++k) for (SparseMatrix::InnerIterator it(Ji,k); it; ++it) { if (it.value() != 0) J.insert(it.row(),i) = it.value(); } //J.block(0,i,Ji.rows(),1) = bi.block(0,0,Ji.rows(),1); } J.makeCompressed(); return J; }