预先查询插值

Phi*_*ard 5 matlab simulink

我需要执行许多(数千个)查找操作,其中查找中的断点不会更改。一个简单的例子是

% create some dummy data
% In practice
% - the grid will be denser, and not as regular
% - each page of v will be different
% - v will have thousands of pages
[x,y] = ndgrid(-5:0.1:5);
n_surfaces = 10;
v = repmat(sin(x.^2 + y.^2) ./ (x.^2 + y.^2),1,1,n_surfaces);

[xq,yq] = ndgrid(-5:0.2:5);
vq = nan([size(xq),n_surfaces]);
for idx = 1:n_surfaces
   F = griddedInterpolant(x,y,v(:,:,idx));
   vq(:,:,idx) = F(xq,yq);
end
Run Code Online (Sandbox Code Playgroud)

请注意,通过执行以下操作可以略微加速上述代码,

F = griddedInterpolant(x,y,v(:,:,1));
for idx = 1:n_surfaces
   F.Values = v(:,:,idx);
   vq(:,:,idx) = F(xq,yq);
end
Run Code Online (Sandbox Code Playgroud)

但是,插值通常是一个两步过程,

  1. 确定每个新点的指数和区间分数
  2. 执行插值以获得新值

并且在上面的代码中,这两个步骤都在每个循环中执行。但是,步骤1在每个循环中都是相同的,因此执行数千次效率不高。我想知道是否有人可以将两个步骤分开,只执行一次第一步,然后在循环中执行第二步?

(对于熟悉Simulink的人,这等效于将Prelookup与使用Prelookup块的多个插值结合使用。)

编辑:

@ rahnema1(多维线性插值的预计算权重)在评论中链接的问题几乎是我想要的。但是,在将代码转换为在CPU(而不是GPU)上运行并使用双精度算法时,它比我在问题开始时使用m代码的速度慢了大约3倍。无论插入的曲面数量如何,该时间似乎都保持不变(我尝试了从10到1000的值)。

问题在于执行V(I)链接代码中使用的索引操作。即使sum(W.*V(I),2)在mex文件中完成了完整操作,执行时间也比上面的m代码要慢。