Matlab 散乱三维电场数据插值

Matlab 散乱三维电场数据插值,matlab,Matlab,我测量了以下形式的三维电场数据: pos = [x1 y1 z1 x2 y2 z2 . . . x1000 y1000 z1000] ef = [e_x1 e_y1 e_z1 e_x2 e_y2 e_z2 . . . e_x1000 e_y1000 e_z1000] 这些位置位于半个球体内。我希望能够在球体的某个点对电场进行插值,这样我就能得到电场分量的所有三个值,而不仅仅是

我测量了以下形式的三维电场数据:

 pos = [x1 y1 z1
        x2 y2 z2
         .  .  . 
        x1000 y1000 z1000]
 ef = [e_x1 e_y1 e_z1
       e_x2 e_y2 e_z2
         .    .    . 
       e_x1000 e_y1000 e_z1000]

这些位置位于半个球体内。我希望能够在球体的某个点对电场进行插值,这样我就能得到电场分量的所有三个值,而不仅仅是整个场的范数。interp3不起作用,因为点不在网格中。scatterdinterpolant需要范数作为输入,生成的函数只返回范数。关于使用什么函数或如何解决此问题,有何建议

scatterdinterpolant
一次只插值一列样本,但插值向量场的一种方法是独立地插值向量的每个分量

这对于
散射极间体
来说很简单

componentInterpolants = cellfun(@(v) {scatteredInterpolant(pos,v)}, num2cell(ef,1));
这就给您留下了一个由三个
scatterdinterpolant
对象组成的单元数组,每个对象对应于场的笛卡尔分量。通过针对指定的坐标分别计算它们,并连接结果,可以得到每个给定坐标的电场矢量。可以定义一个方便的函数,为给定偏移坐标提供完整的插值向量场:

efInterpolant = @(coords) cell2mat(cellfun(@(interpolant) {interpolant(coords)}, componentInterpolants));
验证此操作是否精确插值原始向量场(浮点错误除外):

assert(全部(abs(ef-efInterpolant(pos))

如果独立地插值每个笛卡尔分量无法在该字段中预期的向量分量之间保持某种关系,则可能需要不同的数值方法-可能需要在采用相同插值方法之前进行一些坐标变换-但这可能更像是一个问题数学堆栈交换站点。

griddata
可能是您想要的。根据文档,该函数将样本值作为向量,而不是数组。我想它也会使用规范?你说的“规范”是什么意思?还有,你说的“向量而不是数组”是什么意思?区别是什么?你只需要做
griddata(pos(:,1),pos(:,2),pos(:,3),ef(:,1),yourpointsx,yourpointsy)
对不起,我指的是矩阵。范数是指向量的第二个范数。所以
sqrt(e_x^2+e_y^2+e_z^2)
。您的第二个注释是否计算了某个点的efield的x分量?
assert(all(all(abs(ef - efInterpolant(pos)) < eps * 2)));