使用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.012
,yVec = 0.37
和zVec = 1.45
)。我正在使用interp1
函数,因为我无法找到更好的解决方法(我认为这可以通过interp2
或interp3
MATLAB函数实现。通过运行MATLAB分析器,我发现对interp1的调用花费了大量时间。因此,我想知道是否有更快的方法(例如使用interp2
或interp3
MATLAB函数使用较少的调用,甚至可能在多维数组中合并我的3个结果矩阵)?
答案 0 :(得分:0)
根据评论中的建议,您可以使用网格化griddedInterpolant
。我不认为在MATLAB中有一个标准程序可以优化矢量场的插值(虽然我看起来不够彻底地陈述这个事实)。因此,我认为您必须为每个单独的函数griddedInterpolant
,R1
和R2
使用不同的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))])