2016-05-13 130 views
1

使用3個向量和3個函數,我構建了3個結果矩陣。下面是什麼我實際上做一個短期和簡單的例子:3D矩陣的插值

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.37zVec = 1.45)。我正在使用interp1函數,因爲我無法找到更好的解決方法(我認爲這可以通過interp2interp3 MATLAB函數來實現)。通過運行MATLAB分析器,我發現調用interp1需要花費很多時間。因此,我想知道是否有更快的方法來完成此操作(例如,使用interp2interp3 MATLAB函數來減少調用,或者甚至可以將我的3個結果矩陣合併到多維數組中)?

+0

我不知道它是否更快,但我認爲matlab建議使用'griddedInterpolant'。 – AnonSubmitter85

回答

0

正如評論中所建議的那樣,您可以使用網格griddedInterpolant。我不認爲在MATLAB中有一個用於優化矢量場插值的標準程序(儘管我沒有足夠透徹地描述這個事實)。因此,我認爲您將不得不爲每個單獨的功能R1,R2R3使用不同的griddedInterpolant

%% 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))])