我有矢量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)每个都可以是相同数量元素的数组。使用专业代码的任何有效方式?
答案 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
是行向量。