kdb - (q/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 行。
我该如何解决?
谢谢!
解决方案
您遇到此问题的原因是数学细节矩阵除法。
矩阵除法可以通过取矩阵的逆然后矩阵相乘来执行。在 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
是 row 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
不相同。
希望有帮助。
推荐阅读
- angular - 在单元格渲染器中获取值列键?
- python - 发生异常:AttributeError 'Class' 对象没有属性 'Method'
- outlook - Debug Outlook VSTO Plugin from Visual Studio 2017 does not work --> debug not possible removing deployment from Outlook
- java - Java和MySql之间的连接
- excel - 尝试对集合进行排序时类型不匹配
- laravel - Vuejs Laravel Axios 创建请求
- jquery - 添加 data-bv-trigger="null" 使 bootstrapvalidator 只工作一次
- c# - unity 3d ondular 地形生成
- r - R中kmean的创建预测函数
- r - 如何使用自定义函数执行矢量化操作,将结果添加到列表中?