JavaScript三线性插值函数

6

大家好,

我认为我需要一个三线性插值的函数。

以下是详细信息:

我有一个三维数据集:

  • 第一维从0到100,每次增加5
  • 第二维从0到100,每次增加5
  • 第三维从0到1,每次增加0.1

因此,我有4851个总值(21 x 21 x 11)。

如果我需要找到(10,25,0.3)的值-那很容易-我可以在三维数组中查找。

但是,我需要能够给出最佳近似值,例如(17,48,0.73)的维度值。

因此,我认为我需要一个三线性插值(尽管我肯定会欣赏任何更好方法的建议,或者提示我完全错误的主题...)

快速谷歌搜索得出以下公式:

Vxyz = 
V000(1-x)(1-y)(1-z) +
V100x(1-y)(1-z) +
V010(1-x)y(1-z) +
V001(1-x)(1-y)z +
V101x(1-y)z +
V011(1-x)yz +
V110xy(1-z) +
V111xyz 

这看起来就是我想要的,但我不确定x、y和z代表什么。如果我猜的话,x是一个比率——我的“目标”第一维值与我已有的最近两个值之间的距离,y是第二维的比率,z则是第三维的比率。

当然,由于我真的不知道在说什么,所以我不知道这是对还是错。

因此,理想情况下,我希望能得到一些Javascript代码或伪代码,准确地说明如何实现这一点。

非常感谢!


你用它做什么?只是好奇一下 :) - Matt Baker
1
Matt - 这是一种财务规划应用程序。我的客户投资咨询团队给了我一张表格。三个维度是您的年龄、计划退休年龄和您的股票/债券比例;该表格显示了您的投资组合预计产生的退休收入。因此,如果您今年30岁,计划在65岁退休,并且您的投资组合中85%为股票,则您的投资组合将产生$x的退休收入。这很好用,但间隔较大,我需要能够估算间隔之间的输入值。 - mattstuehler
1个回答

6
你所看到的代码试图对包含要查找值的点的数据集中具有顶点的八个点进行加权平均。
对于一个点p
// Find the x, y and z values of the 
// 8 vertices of the cube that surrounds the point
x0 = Math.floor(p.x / 5);
x1 = Math.floor(p.x / 5) + 1;

y0 = Math.floor(p.y / 5);
y1 = Math.floor(p.y / 5) + 1;

z0 = Math.floor(p.z / .1);
z1 = Math.floor(p.z / .1) + 1;

// Look up the values of the 8 points surrounding the cube
p000 = dataset[x0][y0][z0];
p001 = dataset[x0][y0][z1];
// ...

// Find the weights for each dimension
x = (x - x0) / 5;
y = (y - y0) / 5;
z = (z - z0) / .1;

// Compute the guess using the method you found
// ...

Daniel,非常感谢您的回复!看起来正是我所需要的。谢谢,Matt - mattstuehler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接