Interpn - 改变输出

phd*_*ent 7 performance matlab interpolation vectorization

我有4个网格:

  1. kgrid 这是[77x1]
  2. x 这是[15x1]
  3. z 这是[9x1]
  4. s 这是[2x1]

然后我有一个功能:

  1. kprime 这是[77x15x9x2]

我想kprime在某些点插值ksim (750 x 1)并且zsim (750 x 1)(xsim是标量).我在做:

[ks, xs, zs, ss] = ndgrid(kgrid, x, z, [1;2]);
Output = interpn(ks, xs, zs, ss, kprime, ksim, xsim, zsim, 1,'linear');
Run Code Online (Sandbox Code Playgroud)

这个插值的问题是,给出的输出是所有组合ksimzsim,这意味着输出为750x750.我确实需要750x1的输出,在所有组合意味着代替插值ksimzsim我只需要在插值ksim(1,1)zsim(1,1),然后ksim(2,1)zsim(2,1),然后ksim(3,1)zsim(3,1)

换句话说,在Output我做完之后:

Output = diag(squeeze(Output));
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用这个输出,然后只选择我想要的数字,但这是非常低效的,因为它实际上插入我实际上不需要的所有其他点.任何帮助赞赏.

Tas*_*nou 6

TL; DR:更改xsim和(ssim)从定标器以相同的大小的矢量ksimzsim

Output = interpn (ks, xs, zs, ss,           ...
                  kprime,                   ...
                  ksim,                     ...
                  repmat(xsim, size(ksim)), ... % <-- here
                  zsim,                     ...
                  repmat(1, size(ksim)),    ... % <-- and here
                  'linear');
Run Code Online (Sandbox Code Playgroud)


说明:

ksim,xsim,zsim,和ssim的输入都需要具有相同的形状,使得在该形状每个公共位置,各输入作为"内插标"分量内插的对象.请注意,虽然它们都需要具有相同的形状,但这种形状在尺寸和尺寸方面可以是任意的.

相反,如果您传递不同大小的向量(毕竟,标量是长度为1的向量),则这些将被解释为ndgrid构造组件.所以,你实际上是指示interpn评估由矢量定义的网格上所有的插值ksim,并且zsim(和你的单身xsimssim).这就是为什么你有一个2D网格外观的输出.


请注意,相同的方案也适用于构造向量(即ks,xs,zs和ss),即您可以使用"向量语法"而不是"通用形状"语法来定义网格,即

Output = interpn(kgrid, x, z, s, kprime, % ...etc etc
Run Code Online (Sandbox Code Playgroud)

你会得到相同的结果.

  • 好吧,这可能没有任何理由变坏了.说实话,我确实非常仔细地阅读了文档,并没有得到它.@TasosPapastylianou回答对我的帮助远远超过了tvo.tvo没告诉我任何我还没读过的东西. (4认同)

tvo*_*tvo 5

文件:

查询点,指定为实际标量,向量或数组.

  • 如果Xq1,Xq2,...,Xqn是标量,则它们是Rn中单个查询点的坐标.
  • 如果Xq1,Xq2,...,Xqn是不同方向的矢量,则Xq1,Xq2,...,Xqn被视为Rn中的网格矢量.
  • 如果Xq1,Xq2,...,Xqn是相同大小和方向的向量,则Xq1,Xq2,...,Xqn被视为Rn中的散点.
  • 如果Xq1,Xq2,...,Xqn是相同大小的数组,则它们表示查询点的完整网格(以ndgrid格式)或Rn中的散点.

回答

您希望以粗体突出显示用法.因此,你必须确保xsimssim(你的代码示例中"1")的大小750x1.然后,所有查询向量都是相同的长度和方向,使得它可以被识别为Rn中的散乱点的向量.然后,输出将750x1根据需要为矢量.