Matlab中网格数据插值单元阵列的有效处理

时间:2018-06-06 18:24:14

标签: matlab

我有矢量L1,Lh,x和大小分别为NL,NL,Nx和Nalp的alp。我还有一个大小为NL * NL * Nx * Nalp的矩阵G. G是L1,Lh,x和alp的函数。总之,我在G中有网格数组和样本值。

对于每个x和alp,我创建一个插值并存储在一个单元格数组中。请参阅下面的代码段:

for ixs=1:Nx
  for ias=1:Nalp
    Gn(:,:,ixs, ias)={griddedInterpolant({Ll, Lh}, G(:,:,ixs, ias),'linear', 'none')};
  end
end

优点:与interp2相比,这是非常快的,特别是因为我必须多次评估Gn。

缺点:(1)需要大量内存,(2)不能轻易地进行矢量化,以避免出现以下类型的额外循环(再次多次评估)

for ixs=1:Nx
  for ias=1:Nalp
    GGn=Gn{:,:, ixs, ias};
    SomeVector(ixs, ias)*GGn(Llnx, Lhnx);
  end
 end

(a)如果我能以某种方式对名为Gn的整类griddedInterpolant进行矢量化,我可以在最后一个循环上进行优化,并且(b)如果我只能存储矢量Ll和Lh,我可以更有效地使用内存

我需要你的帮助。确切地说,我怎样才能更有效地做到这一点?谢谢。

最佳,

BK

编辑: 一个解决方案是生成一个函数Gn,它将Ll和Lh作为参数,给定x和alp。 Gn返回一个函数句柄数组,每个句柄对应一个(x,alph)。然后,调用Gn(Llnx,Lhnx,x,alp)返回内插值。现在,(Llnx,Lhnx,x,alp)每个都可以是相同数量元素的数组。使用专业代码的任何有效方式?

1 个答案:

答案 0 :(得分:0)

使用提供的方法here,您可以预先计算多维线性插值的权重。因此,您不需要griddedInterpolan t并使用bsxfun来使用预先计算的权重来矢量化插值计算。

[W I]=lininterpnw(Ll, Lh, Llnx, Lhnx);
GGn = reshape(G,NL* NL,[]);
result = squeeze(sum(bsxfun(@times, W, reshape(GGn(I(:),:),size(G)))));
bsxfun(@times, reshape(SomeVector,1,[]), result);

result矩阵中的每一列都是每个2D矩阵插值的输出。

这里假设1Ll, Lh, Llnx, Lhnx是行向量。