Значение интерполяции из 3D матриц
С 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
На данный момент я звоню 6 раз interp1
Функция MATLAB для интерполяции (линейно) 3 результирующих матриц для определенного набора значений xVec, yVec и zVec (например, xVec = 0.012
, yVec = 0.37
, а также zVec = 1.45
). Я использую interp1
функционировать, так как я не смог найти лучший способ решения этой проблемы (я думаю, что это может быть возможно с interp2
или же interp3
Функции MATLAB). Запустив профилировщик MATLAB, я обнаружил, что вызовы interp1 занимают много времени. Следовательно, я хотел бы знать, есть ли более быстрый способ сделать это (например, использовать меньше вызовов, используя interp2
или же interp3
Функция MATLAB, или, может быть, даже объединение моих 3-х матриц результата в многомерный массив)?
1 ответ
Как предлагается в комментариях, вы можете использовать gridded 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))])