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

时间:2018-10-26 18:59:43

标签: kdb

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

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

和以下要插值的数据:

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]

正在生成

index   value
0   enlist 1.47
1   enlist 0nf
2   enlist 1.49

为什么我在第二行中得到0

更新:其他示例的行为不一致

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]

产生

index   value
0   enlist 1f
1   enlist 0nf
2   enlist 0nf
3   enlist 1f

因此,看起来有时公式在行0和3行有效,有时却行不通,行1和2行。

我该如何解决?

谢谢!

1 个答案:

答案 0 :(得分:4)

您遇到此问题的原因是由于数学细节矩阵划分。

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

q) enlist[2 2f] lsq (1 2f;3 4f)
-1 1
q) enlist[2 2f] mmu inv (1 2f;3 4f)
-1 1

您向x输入的lsfit值之一是行7.5 7.5。使用z的{​​{1}}值,可以在1f操作中将该向量转换为矩阵(1 1;7.5 7.5)。然后在xexp操作中使用此矩阵。

然后发生问题,因为lsq不可逆。当且仅当行列式非零时,矩阵才是可逆的。 (1 1;7.5 7.5)矩阵的行列式为2 x 2。在您的示例中,AD - BCA = 1B = 1C = 7.5。因此行列式为零,矩阵不可逆,函数的输出为D = 7.5

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

希望有帮助。