我正在寻找Matlab中的一个(理想的内置)函数,该函数以与R中相同的方式计算B样条基矩阵,例如以样条为基础,在20度的3度等速结中,我会在R
Reliability: 255/255
要想在Matlab中获得相同的效果,我以为我可以使用
require(splines)
B = bs(x = seq(0,1,length.out=100),
knots = seq(0, 1, length.out=20), # 20 knots
degree = 3,
intercept = FALSE)
matplot(B,type="l")
但是可以看到,然后没有边界结。 有什么想法要使Matlab中与R中相同的语法是什么?
PS R用于B = spcol(linspace(0,1,20),3,linspace(0,1,100));
plot(B);
的代码采用某种简化形式:
bs()
答案 0 :(得分:9)
您的代码中有两处错误
我认为学位和顺序之间有些混淆。您已经在R代码中正确指定了degree=3
,但是在MATLAB中,传递给spcol
的参数是样条线的 order 。通常,阶数为n
的样条函数是阶数为n-1
的分段多项式。 [1]
由于MATLAB的spcol
接受 order 作为输入,因此您需要指定order=4
而不是degree=3
来完成! 您在MATLAB中生成了二次样条,在R中生成了三次样条。
您的R图中的末端结似乎具有非奇异的多重性,这意味着它们是重复的。使端点具有多个degree+1
(在我们的示例中为4)意味着它们的位置与控制多边形重合,这被称为 clamped 结。 [2]
在R documentation for bs
中,它指出结节数组包含内部断点。似乎边界结被定义为在较长的代码示例中被夹紧,因为它们在此行重复degree+1
次,
knots <- c(rep(Boundary.knots[1], (degree+1)), interior.knots.sorted, rep(Boundary.knots[2], (degree+1)))
这对于固定的端点有意义,并备份了有关使用 degree 输入的早期点。
因此,我们在MATLAB中的结矢量(具有固定的端点)应为:
k = [0, 0, 0, linspace(0,1,20), 1, 1, 1]
结论
让我们使用 order 4,并在端点处使用具有固定结点的结点矢量:
B = spcol([0, 0, 0, linspace(0,1,20), 1, 1, 1], 4, linspace(0,1,100));
plot(B);
我们现在可以看到边界结,就像它们在R图中一样,并且在每个末端有2个附加峰,由于3个钳位结的影响,这些附加峰较小。
进一步阅读
[ 1 ]:维基百科B样条页面
[ 2 ]:麻省理工学院的有用页面,其中更深入地描述了钳位节点和数学。