2016-05-13 17 views
1

Mit 3 Vektoren und 3 Funktionen baue ich 3 Ergebnismatrizen. Hier ist ein kurzes und vereinfachtes Beispiel, was ich eigentlich tun:Interpolationswert von 3D-Matrizen

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 

Ab jetzt, ich rufe 6 mal die interp1 MATLAB-Funktion, um (linear) interpoliert wird die 3 Ergebnismatrizen für einen bestimmten Satz von xVec-, yVec- und zVec-Werten (z. B. xVec = 0.012, yVec = 0.37 und zVec = 1.45). Ich benutze die interp1 Funktion, da ich nicht in der Lage war, eine bessere Lösung zu finden (ich denke, das könnte mit interp2 oder interp3 MATLAB-Funktionen möglich sein). Beim Ausführen des MATLAB-Profilers habe ich festgestellt, dass die Aufrufe von interp1 sehr viel Zeit benötigen. Daher würde ich gerne wissen, ob es eine schnellere Möglichkeit gibt, dies zu tun (z. B. weniger Aufrufe mit der MATLAB-Funktion interp2 oder interp3, oder vielleicht sogar meine 3 Ergebnismatrizen in einem mehrdimensionalen Array zusammenführen)?

+0

Ich weiß nicht, ob es schneller ist, aber ich denke, Matlab empfiehlt "griddedInterpolant". – AnonSubmitter85

Antwort

0

Wie in den Kommentaren empfohlen, können Sie gridded griddedInterpolant verwenden. Ich glaube nicht, dass es in MATLAB eine Standardprozedur für die Optimierung der Interpolation von Vektorfeldern gibt (obwohl ich nicht gründlich genug gesucht habe, um dies als Tatsache zu bezeichnen). Daher denke ich, dass Sie für jede einzelne Funktion R1, R2 und R3 einen anderen griddedInterpolant verwenden müssen.

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