下面的公式用于生成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行。
我怎么才能修好它?
谢谢!
发布于 2018-10-27 00:57:14
您遇到此问题的原因是由于数学细节矩阵的划分。
矩阵除法的方法是取矩阵的逆,再求矩阵的乘积。在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值1f,这将将该向量转换为xexp操作中的矩阵(1 1;7.5 7.5)。然后在lsq操作中使用此矩阵。
出现这个问题是因为(1 1;7.5 7.5)不是可逆的。矩阵是可逆的当且仅当行列式是非零的.2 x 2矩阵的行列式是AD - BC。在您的示例中,A = 1、B = 1、C = 7.5和D = 7.5。所以行列式是零,矩阵不是可逆的,函数的输出是Onf。
要解决此问题,您必须确保x每一行中的两项不相同。
希望这能有所帮助。
https://stackoverflow.com/questions/53014838
复制相似问题