来自3D矩阵的插值

时间:2016-05-13 18:29:25

标签: matlab multidimensional-array linear-interpolation

使用3个向量和3个函数,我构建了3个结果矩阵。这是我正在做的简短示例:

xVec = -0.2:0.05:0.2; % Vector 1
yVec = 0:0.1:0.4;     % Vector 2
zVec = 1:3;           % Vector 3

[X,Y,Z] = meshgrid(xVec,yVec,zVec);

R1 = (X.^2+Y.^2)./sqrt(Z);           % Result matrix 1
R2 = sin(X.^2+Y.^2)./exp(Z);         % Result matrix 2
R3 = cos(X.^2+Y.^(1/2)).*(Z.^(1/2)); % Result matrix 3

截至目前,我正在调用interp1 MATLAB函数的6倍,以便为特定的xVec,yVec和zVec值集合(线性)3个结果矩阵(例如xVec = 0.012yVec = 0.37zVec = 1.45)。我正在使用interp1函数,因为我无法找到更好的解决方法(我认为这可以通过interp2interp3 MATLAB函数实现。通过运行MATLAB分析器,我发现对interp1的调用花费了大量时间。因此,我想知道是否有更快的方法(例如使用interp2interp3 MATLAB函数使用较少的调用,甚至可能在多维数组中合并我的3个结果矩阵)?

1 个答案:

答案 0 :(得分:0)

根据评论中的建议,您可以使用网格化griddedInterpolant。我不认为在MATLAB中有一个标准程序可以优化矢量场的插值(虽然我看起来不够彻底地陈述这个事实)。因此,我认为您必须为每个单独的函数griddedInterpolantR1R2使用不同的R3

%% griddedInterpolant

[X, Y, Z] = ndgrid(xVec, yVec, zVec);

R1 = (X.^2+Y.^2)./sqrt(Z); 

F = griddedInterpolant(X, Y, Z, R1, 'cubic');

figure
subplot(121)
s = slice(Y, X, Z, R1, 0.2, [-0.1 0.1], 2);
set(s, 'EdgeColor', 'none');
for n = 1 : length(s)
    set(s(n),'alphadata', get(s(n), 'cdata'), 'facealpha', 'flat')
end
xlabel('y');
ylabel('x');
zlabel('z');
view([-130 30]);
title('Original data');

xqVec = linspace(min(xVec), max(xVec), numPoints); % Vector 1 interpolant
yqVec = linspace(min(yVec), max(yVec), numPoints); % Vector 2 interpolant
zqVec = linspace(min(zVec), max(zVec), numPoints); % Vector 3 interpolant
[Xq, Yq, Zq] = ndgrid(xqVec, yqVec, zqVec);

tic
R1q = F(Xq, Yq, Zq);
toc

subplot(122)
s = slice(Yq, Xq, Zq, R1q, 0.2, [-0.1 0.1], 2);
set(s, 'EdgeColor', 'none');
for n=1:length(s)
    set(s(n), 'alphadata', get(s(n), 'cdata'), 'facealpha', 'flat')
end
xlabel('y');
ylabel('x');
zlabel('z');
view([-130 30]);
title('Gridded interpolant');

%% Query at a point

disp(['R1 at [0 0.21 2.1] is ' num2str(F(0, 0.21, 2.1))])