Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java n维未知点数的多线性插值_Java_Multidimensional Array_Interpolation - Fatal编程技术网

Java n维未知点数的多线性插值

Java n维未知点数的多线性插值,java,multidimensional-array,interpolation,Java,Multidimensional Array,Interpolation,我目前正在尝试创建一种方法,该方法可以对n维空间中未知数量的点(数量等于2^n)进行多线性插值 n=1(无插值)和n=2(线性插值)的情况已经实现,并且似乎可以工作。但是现在我已经在努力使双线性插值(对于n=4的情况)维度不可知,我不知道从这一点(n=8,…,2^n)开始应该如何进行 是否有解决此问题的通用方法,或者我是否应该硬编码一些案例,并抛出一个UnsupportedOperationException 下面我添加了一个SSCCE,希望它能澄清我的问题。它由一个point类组成,该类存储坐

我目前正在尝试创建一种方法,该方法可以对n维空间中未知数量的点(数量等于2^n)进行多线性插值

n=1(无插值)和n=2(线性插值)的情况已经实现,并且似乎可以工作。但是现在我已经在努力使双线性插值(对于n=4的情况)维度不可知,我不知道从这一点(n=8,…,2^n)开始应该如何进行

是否有解决此问题的通用方法,或者我是否应该硬编码一些案例,并抛出一个UnsupportedOperationException

下面我添加了一个SSCCE,希望它能澄清我的问题。它由一个point类组成,该类存储坐标和一个值,还包含一些功能,如计算到另一个点的距离,以及插值方法,其中已经包含了我对n=1和n=2情况的实现

代码
import java.util.ArrayList;
导入java.util.List;
公共类内插器{
公共静态void main(字符串[]args){
插值器ip=新插值器();
Point currentPoint=新点(新长[]{5,5},0);
列表邻居=新的ArrayList(){{
添加(新点(新长[]{3,3},7));
添加(新点(新长[{10,10},4));
}};
System.out.println(ip.interpolate(currentPoint,neights));
}
公共浮点插值(点currentPoint,列出邻居){
if(邻居.size()==1){
//无需仅对一个邻居进行插值
返回neights.get(0.getValue();
}else if(neights.size()==2){
//点与两个相邻点之间的距离
float distance one=currentPoint.distance(neights.get(0));
float distance two=currentPoint.distance(neights.get(1));
浮点完成距离=距离一+距离二;
//计算重量
浮动权重1=1-距离1/完成距离;
浮动重量2=1-距离2/完成距离;
//线性插值
返回邻居。get(0)。getValue()*weightOne
+get(1.getValue()*weightwo;
}else if(neights.size()==4){
//TODO:双线性插值
}else if(neights.size()==8){
//TODO:三线性插值
}
//TODO:四次线性插值还是更高?
返回-1;
}
公共静态类点{
私人长[]m_坐标;
私人浮动m_值;
公共点(最终长[]坐标,浮点值){
此.m_坐标=坐标;
此m_值=值;
}
公共长[]getCoordinates(){
返回此.m_坐标;
}
公共int numDim(){
返回m_坐标。长度;
}
公共长dim(最终int i){
返回这个.m_坐标[i];
}
公共浮动距离(终点其他点){
如果(this.numDim()!=otherPoint.numDim()){
抛出新的IllegalArgumentException(
“无法测量不同维度点之间的距离”);
}
浮点数和=0;
对于(int i=0;i


这似乎与您的算法相同,但与维度无关。我不是说你的计算是正确的-我只是说我认为这是相同的计算,但对于n维:

public float interpolate(Point currentPoint, List<Point> neighbors) {
  int dimensions = neighbors.size();
  float[] distance = new float[dimensions];
  float sumDistances = 0;
  for (int i = 0; i < dimensions; i++) {
    distance[i] = currentPoint.distance(neighbors.get(i));
    sumDistances += distance[i];
  }
  float[] weight = new float[dimensions];
  for (int i = 0; i < dimensions; i++) {
    weight[i] = 1 - distance[i] / sumDistances;
  }
  float interpolatedDistance = 0;
  for (int i = 0; i < dimensions; i++) {
    interpolatedDistance += neighbors.get(i).getValue() * weight[i];
  }
  return interpolatedDistance;
}
public float interpolate(点currentPoint,列表邻居){
int-dimensions=neights.size();
浮动[]距离=新浮动[尺寸];
浮动距离=0;
对于(int i=0;i
我怀疑这是计算距离的正确策略。@TilmanHausherr-请解释。这与OP使用的算法相同,但推广到n维。我表达错误,对不起,我应该在问题上发表评论,而不是在你的答案上发表评论。我想说的是,我怀疑这是多线性插值的正确策略,因为它使用的是距离,而不是使用矩形、立方体等的内容大小,或者使用维基百科中解释的逐步方法(例如三线性插值)。换句话说,我同意你的文字“我不是说你的计算是正确的”:-)
public float interpolate(Point currentPoint, List<Point> neighbors) {
  int dimensions = neighbors.size();
  float[] distance = new float[dimensions];
  float sumDistances = 0;
  for (int i = 0; i < dimensions; i++) {
    distance[i] = currentPoint.distance(neighbors.get(i));
    sumDistances += distance[i];
  }
  float[] weight = new float[dimensions];
  for (int i = 0; i < dimensions; i++) {
    weight[i] = 1 - distance[i] / sumDistances;
  }
  float interpolatedDistance = 0;
  for (int i = 0; i < dimensions; i++) {
    interpolatedDistance += neighbors.get(i).getValue() * weight[i];
  }
  return interpolatedDistance;
}