13 template <
class DerivedPo
ints,
class DerivedGradPo
ints>
14 Eigen::MatrixXd mat_a(
const model& model,
const Eigen::MatrixBase<DerivedPoints>& points,
15 const Eigen::MatrixBase<DerivedGradPoints>& grad_points) {
16 const auto& rbf = model.rbf();
17 auto dim = model.poly_dimension();
18 auto mu = points.rows();
19 auto sigma = grad_points.rows();
20 auto m = mu + dim * sigma;
22 Eigen::MatrixXd a(m, m);
24 auto aa = a.topLeftCorner(mu, mu);
25 aa.diagonal().array() = rbf.evaluate(geometry::vector3d::Zero()) + model.nugget();
26 for (index_t i = 0; i < mu - 1; i++) {
27 for (index_t j = i + 1; j < mu; j++) {
28 aa(i, j) = rbf.evaluate(points.row(i) - points.row(j));
34 auto af = a.topRightCorner(mu, dim * sigma);
35 for (index_t i = 0; i < mu; i++) {
36 for (index_t j = 0; j < sigma; j++) {
37 af.block(i, dim * j, 1, dim) =
38 -rbf.evaluate_gradient(points.row(i) - grad_points.row(j)).head(dim);
41 a.bottomLeftCorner(dim * sigma, mu) = af.transpose();
43 auto ah = a.bottomRightCorner(dim * sigma, dim * sigma);
44 Eigen::MatrixXd ah_diagonal =
45 rbf.evaluate_hessian(geometry::vector3d::Zero()).topLeftCorner(dim, dim);
46 for (index_t i = 0; i < sigma; i++) {
47 ah.block(dim * i, dim * i, dim, dim) = ah_diagonal;
49 for (index_t i = 0; i < sigma - 1; i++) {
50 for (index_t j = i + 1; j < sigma; j++) {
51 ah.block(dim * i, dim * j, dim, dim) =
52 rbf.evaluate_hessian(grad_points.row(i) - grad_points.row(j)).topLeftCorner(dim, dim);
53 ah.block(dim * j, dim * i, dim, dim) = ah.block(dim * i, dim * j, dim, dim).transpose();
该命名空间下主要定义了关于krylov子空间方法的预处理相关的类和函数