我有大小分别为NL、NL、Nx和Nalp的向量Ll、Lh、x和alp。我还有一个大小为NL * NL * Nx * Nalp的矩阵G。G是Ll、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)中的每一个都可以是具有相同数量元素的数组。有没有使用专业代码的有效方法?
发布于 2018-06-07 04:29:11
使用here提供的方法,您可以预先计算多维线性插值的权重。因此,您不需要griddedInterpolant,而是使用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是行向量。
https://stackoverflow.com/questions/50727145
复制相似问题