1 /* 2 * Copyright (C) 2023 Alberto Irurueta Carro (alberto@irurueta.com) 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package com.irurueta.numerical.interpolation; 17 18 import com.irurueta.algebra.Matrix; 19 20 /** 21 * Base class for interpolation methods based on Radial Basis Functions to interpolate sparse 22 * points. 23 */ 24 public abstract class BaseRadialBasisFunctionInterpolator { 25 /** 26 * Dimension of points to be interpolated. 27 */ 28 protected final int dim; 29 30 /** 31 * Number of points provided in a matrix as a basis for interpolation. 32 */ 33 protected final int n; 34 35 /** 36 * Matrix containing points to interpolate from. 37 * Each row contains one point. 38 * Matrix will have n points (rows) having a dimension (columns) equal to dim. 39 */ 40 protected final Matrix pts; 41 42 /** 43 * ith point to make comparisons. 44 */ 45 protected final double[] pi; 46 47 /** 48 * Constructor. 49 * @param ptss Matrix containing points to interpolate from. Each row contains one point. 50 * Matrix will have n points (rows) having a dimension (columns) equal to dim. 51 */ 52 protected BaseRadialBasisFunctionInterpolator(final Matrix ptss) { 53 this.dim = ptss.getColumns(); 54 n = ptss.getRows(); 55 pts = ptss; 56 57 pi = new double[dim]; 58 } 59 60 /** 61 * Returns the interpolated function value at a dim-dimensional point pt. 62 * 63 * @param pt dim-dimensional point where interpolation must be computed. 64 * @return result of interpolation. 65 * @throws IllegalArgumentException if provided point has an invalid length. 66 */ 67 public abstract double interpolate(final double[] pt); 68 69 /** 70 * Computes the euclidean distance between two points. 71 * 72 * @param p1 first point. 73 * @param p2 second point. 74 * @return euclidean distance. 75 */ 76 protected double rad(final double[] p1, final double[] p2) { 77 var sum = 0.0; 78 for (int i = 0; i < dim; i++) { 79 final var value = p1[i] - p2[i]; 80 sum += value * value; 81 } 82 83 return Math.sqrt(sum); 84 } 85 }