【问题标题】:Efficient Manipulation of Cell Array of Gridded Data Interpolant in MatlabMatlab中网格数据插值元胞数组的高效处理
【发布时间】:2018-11-16 12:54:07
【问题描述】:

我有分别大小为 NL、NL、Nx 和 Nalp 的向量 Ll、Lh、x 和 alp。我还有一个大小为 NL * NL * Nx * Nalp 的矩阵 G。 G 是 Ll、Lh、x 和 alp 的函数。我一起在 G 中创建了网格数组和样本值。

对于每个 x 和 alp,我创建一个插值并存储在一个元胞数组中。见下面代码sn-p:

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

【问题讨论】:

    标签: matlab


    【解决方案1】:

    使用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 矩阵中的每一列都是每个二维矩阵的插值输出。

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

    【讨论】:

    • 谢谢@rahnema1。一个重要的问题是 Llnx 和 Lhnx 是事先不知道的,因此不能按照“lininterpnw”预先计算权重。我已经编辑了这个问题。抱歉,修改时间过长。
    猜你喜欢
    • 1970-01-01
    • 2018-05-19
    • 1970-01-01
    • 2011-06-05
    • 1970-01-01
    • 2023-03-03
    • 2016-08-01
    • 1970-01-01
    • 2017-05-29
    相关资源
    最近更新 更多