快速interp1与'spline'

53次浏览(最近30天)
肯
2015年4月1日
评论道: 约翰D 'Errico 2015年7月6日
现在我正在为计算机视觉编写一个matlab工具箱。我使用了很多函数'interp1(,,,'spline')',这一步实际上占了整个计算时间的50%。只是想知道是否有更快的方法来计算这个,还有类似mex文件之类的东西。非常感谢。

接受的答案

约翰D 'Errico
约翰D 'Errico 2015年4月1日
编辑:约翰D 'Errico 2015年4月1日
简单的答案是不用interp1。只需要使用样条和ppval。
问题是,对于样条插值,每次调用interp1时,它必须有效地调用数据内部的样条。通过调用一次样条函数,可以提高效率。
例如……
x = linspace (1100);
y = exp (x);
Xev = rand(1,1000)*2 - 1;
S =花键(x, y);
时间(@ ()interp1 (x, y, xev,样条的))
ans =
0.0003005
时间(@ ()ppval(年代,xev))
ans =
0.00025177
虽然没有我想的那么大,但还是有些区别的。
如果您愿意将函数预插值到一个更细的区间,那么您可能还会获得一些时间,这样您就可以进行线性插值。由于线性插值将更快地做,这也应该看到一些增益。
x = linspace (1 1 10);
y = exp (x);
xfine = linspace (1, 1, 1000);
xfine yfine = interp1 (x, y,样条的);
Xev = rand(1,1000)*2 - 1;
时间(@ ()interp1 (x, y, xev,样条的))
ans =
0.00028546
时间(@ ()interp1 (xfine、yfine xev))
ans =
0.00022313
你也可以通过使用pchip而不是样条来获得一些好处,因为这是一种更快的方法来构建样条,尽管有时不那么平滑。
时间(@ ()interp1 (x, y, xev,“pship”))
ans =
0.00026064
最后,我记得在文件交换中看到一些工具试图加速interp1,但它们大多是用于线性插值的。
最后,虽然您当然可以使用一个mexfile来提高时间,但前提是您有足够的技能来编写样条插值,并且可以在c中高效地完成。恐怕编译后的MATLAB代码在这里不会给您带来任何好处。
2的评论
约翰D 'Errico
约翰D 'Errico 2015年7月6日
因为interp1现在使用griddedInterpolant,它比ppval更快。然而,没有什么能阻止您做同样的事情,并且仍然得到一个加速,因为不需要在每个调用中重新计算样条。
Xev = rand(1,1e4)*2 - 1;
S = griddedInterpolant (x, y,样条的);
时间(@()年代(xev))
ans =
0.00014841
时间(@ ()interp1 (x, y, xev,样条的))
ans =
0.00051963
事情做的改变。

登录评论。

更多的答案(2)

克里斯·麦库姆
克里斯·麦库姆 2015年4月1日
您是否使用向量或查找点调用interp1 ?如果没有,这样做可以给你一个显著的加速。
1评论
肯
2015年4月1日
我调用interp1来计算二维平面上曲线的样条插值。例如,
new_points =圆(interp1 (t点,ts,花键));
其中“点”是一个大小为alpha*2的矩阵,表示2d平面上的alpha点和每个点的坐标作为一行“点”。更好的解决方案吗?

登录评论。


菲利普
菲利普 2015年6月8日
griddedInterpolant比interp1, interp2等例程快得多。

社区寻宝

在MATLAB中心找到宝藏,并发现社区如何可以帮助你!

开始狩猎!