phd*_*ent 7 performance matlab interpolation vectorization
我有4个网格:
kgrid 这是[77x1]x 这是[15x1]z 这是[9x1]s 这是[2x1]然后我有一个功能:
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)
这个插值的问题是,给出的输出是所有组合ksim和zsim,这意味着输出为750x750.我确实需要750x1的输出,在所有组合意味着代替插值ksim和zsim我只需要在插值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)
我知道我可以使用这个输出,然后只选择我想要的数字,但这是非常低效的,因为它实际上插入我实际上不需要的所有其他点.任何帮助赞赏.
TL; DR:更改xsim和(ssim)从定标器以相同的大小的矢量ksim和zsim
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(和你的单身xsim和ssim).这就是为什么你有一个2D网格外观的输出.
Output = interpn(kgrid, x, z, s, kprime, % ...etc etc
Run Code Online (Sandbox Code Playgroud)
你会得到相同的结果.
查询点,指定为实际标量,向量或数组.
- 如果Xq1,Xq2,...,Xqn是标量,则它们是Rn中单个查询点的坐标.
- 如果Xq1,Xq2,...,Xqn是不同方向的矢量,则Xq1,Xq2,...,Xqn被视为Rn中的网格矢量.
- 如果Xq1,Xq2,...,Xqn是相同大小和方向的向量,则Xq1,Xq2,...,Xqn被视为Rn中的散点.
- 如果Xq1,Xq2,...,Xqn是相同大小的数组,则它们表示查询点的完整网格(以ndgrid格式)或Rn中的散点.
您希望以粗体突出显示用法.因此,你必须确保xsim和ssim(你的代码示例中"1")的大小750x1也.然后,所有查询向量都是相同的长度和方向,使得它可以被识别为Rn中的散乱点的向量.然后,输出将750x1根据需要为矢量.