Значение интерполяции из 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))])
Другие вопросы по тегам