void TpsRegistration::ComputeGradient(const double lambda, const vnl_matrix<double>& gradient, vnl_matrix<double>& grad_all) { grad_all.fill(0); if (lambda > 0) { grad_all.update(2 * lambda * kernel_ * param_tps_, d_ + 1); } grad_all += basis_.transpose() * gradient; }
int select_points(const vnl_matrix<double>&pts, const std::vector<int>&index, vnl_matrix<double>& selected) { int n = index.size(); int d = pts.cols(); selected.set_size(n,d); for (int i = 0; i < n; ++i) { selected.update(pts.extract(1, d, index[i]), i); } return n; }