(q/kdb +)插值公式对某些情况不起作用

Jms*_*Jms 1

我有以下公式在q中生成线性插值:

lsfit:{(enlist y) lsq x xexp/: til 1+z};
interp:{[xn;x;y]sum (1;xn)*flip lsfit[x;y;1]};
Run Code Online (Sandbox Code Playgroud)

以及下面的数据进行插值:

xn:(4.7;7.5;4.9);
x:(3 5f;7.5 7.5;3 5f);
y:(1.3 1.5;2 2f;1.3 1.5);
interp'[xn;x;y]
Run Code Online (Sandbox Code Playgroud)

正在产生

index   value
0   enlist 1.47
1   enlist 0nf
2   enlist 1.49
Run Code Online (Sandbox Code Playgroud)

为什么我要0进入第二排呢?

更新:其他示例的Inconsistet行为

xn:(6;7;8;9);
x:(6 6f;7 7f;8 8f;9 9f);
y:(1 1f;1 1f;1 1f;1 1f);
interp'[xn;x;y]
Run Code Online (Sandbox Code Playgroud)

生成

index   value
0   enlist 1f
1   enlist 0nf
2   enlist 0nf
3   enlist 1f
Run Code Online (Sandbox Code Playgroud)

因此,看起来有时公式有效,第0行和第3行,有时它不行,第1行和第2行.

我该如何解决?

谢谢!

小智 5

您遇到此问题的原因是因为数学细节矩阵划分.

可以通过取矩阵的逆矩阵然后矩阵乘法来执行矩阵除法.在q中,可以通过直接执行这些操作来看出这一点.

q) enlist[2 2f] lsq (1 2f;3 4f)
-1 1
q) enlist[2 2f] mmu inv (1 2f;3 4f)
-1 1
Run Code Online (Sandbox Code Playgroud)

您输入的一个xlsfit是行7.5 7.5.用z的值1f,将其转换该载体导入基质(1 1;7.5 7.5)中的xexp操作.然后在lsq操作中使用该矩阵.

然后出现问题因为(1 1;7.5 7.5)不可逆.当且仅当行列式不为零时,矩阵才是可逆的.2 x 2矩阵的决定因素是AD - BC.在你的榜样,A = 1,B = 1,C = 7.5,和D = 7.5.因此行列式为零,矩阵不可逆,函数的输出为Onf.

要解决此问题,您必须确保每行中的两个项目x不相同.

希望有所帮助.