我正在尝试使用张量产品自学使用样条进行曲面拟合。我正在尝试构建一个玩具示例,但我似乎无法让我的示例正常工作。我会尽力解释。我正在尝试使用 B 样条拟合从双变量高斯采样的一组点。
这就是采样表面的样子。
library(rgl)
library(fda)
binorm = function(x,y)
{
z = (15/ (2*pi)) * exp(-(1/2) * (x^2 + y^2))
return(z)
}
# Set up data
samples = 10
x = seq(-3, 3, length.out = samples)
grid = cbind(rep(x, times=1, each=samples), rep(x, times=samples)) # cartesian product
Y = matrix(binorm(grid[,1], grid[,2]), nrow = samples, ncol = samples) # evaluate at each point
# Plot the surface
surface3d(x,x, Y, col = "green")
我想使用具有 12 个基函数的 6 阶 B 样条基系统。
param.nbasis = 12
param.norder = 6
param.rangeval = c(min(x), max(x))
nbreaks = param.nbasis - param.norder + 2
basis.breaks = seq(param.rangeval[1], param.rangeval[2], length.out = nbreaks)
B.x = bsplineS(x, breaks = basis.breaks, norder = param.norder)
B.y = bsplineS(x, breaks = basis.breaks, norder = param.norder)
(注意:bsplineS() 函数来自 fda 包)
鉴于我在 10 x 10 网格上进行插值。B样条基矩阵是相同的。据我了解,通过阅读文献和这个问题,我想做两个基础矩阵的逐行克罗内克积(请参阅我之前链接的问题)。这样做我得到一个矩阵。
C = matrix(nrow = 10, ncol = param.nbasis^2)
for (i in 1:10)
{
C[i,] = kronecker(B.x[i,], B.y[i,])
}
这是我感到困惑的地方,我应该能够使用正规方程求解系统。我正在做一个未加权的最小二乘拟合,所以我应该能够通过正规方程求解
在 r 代码中,这变成
y = as.vector(Y)
B = solve(t(C) %*% C) %*% t(C) %*% y
但是,我继续收到以下错误:
Error in solve.default(t(C) %*% C) :
Lapack routine dgesv: system is exactly singular: U[7,7] = 0
显然我做错了什么。我无法弄清楚这一点,网络上没有很多代码示例。任何帮助,尤其是代码示例,将不胜感激。