我有以下公式可以在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行。
我该如何解决?
谢谢!
答案 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 - BC
,A = 1
,B = 1
和C = 7.5
。因此行列式为零,矩阵不可逆,函数的输出为D = 7.5
。
要解决此问题,您必须确保Onf
每行中的两个项目不相同。
希望有帮助。