简单的答案是不用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代码在这里不会给您带来任何好处。