How to extract a 2D surface from a 3D data set?

조회 수: 6 (최근 30일)
Donovan Allum
Donovan Allum 2023년 7월 12일
편집: Donovan Allum 2023년 7월 30일
I have a 3D array, T, which has (Nx,Ny,Nz) elements. It contains the temperature of some fluid dynamical system.
I know ahead of time that there is some cylindrical symmetry in the data. As a result, there is some utility in extracting a cylindrical shell surface from the data, which could be contained in a single 2D array (only variables are theta - azimuth - and z).
Currently, I do this using a large loop (code at the bottom). This is obviously quite slow since I am interpolating at every z slice. Is there a way to do this without several loops? Perhaps using interp3?
One idea I had was to try
xcoord = rnow.*sin(theta);
ycoord = rnow.*sin(theta);
z1d = Z(1,1,:);
tprof = interp3(X,Y,Z,tnow,xcoord,ycoord,z1d,'spline');
The problem would be that if this worked, then tprof is just a different 3D array on the new grid. Essentially a cylindrical shell in cartesian coordinates. If this works, how can I convert it to cylindrical coordinates and then remove the radial component (since it would be contant with r)?
num_points = 1000;
%Dimensions
Lx = 1;
Ly = 2;
Lz = 1.2;
%Number of grid points
Nx = 50;
Ny = 100;
Nz = 20;
%Calculate x,y,z grid
x1d = linspace(0,Lx,Nx);
y1d = linspace(0,Ly,Ny);
z1d = linspace(0,Lz,Nz);
[X,Y,Z] = meshgrid(x1d,y1d,z1d);
%Example field
Data = X.^3+2.*Y-Z;
%Azimuthal angle in polar coordinates
%Origin is at Data(1,1,1)
theta = linspace(0,pi/2,num_points);
rnow = 1;
for AzimuthalPoint = 2:num_points
% Calculate the angle along the arc of r = rnow
% Calculate the corresponding y-coordinate
ycoord = rnow * sin(theta(AzimuthalPoint));
xcoord = rnow * cos(theta(AzimuthalPoint));
for VertPoint = 1:Nz
% Find the temperature at the radius r = rnow by interpolating tnow1d
% using spline interpolation
tprof(AzimuthalPoint,VertPoint) = interp2(x1d, y1d, Data(:,:,VertPoint), xcoord, ycoord, 'spline');
end
end

답변 (1개)

Supraja
Supraja 2023년 7월 27일
I understand that you want to convert your coordinates to cylindrical then remove the radial component from it.
To convert the coordinates from cylindrical to 2 D matrix by removing the radial component, you can use the “squeeze” function in MATLAB. The detailed documentation link for the function is attached is here: https://www.mathworks.com/help/matlab/ref/squeeze.html
For the initial part of conversion of coordinates to cylindrical system, you can mathematical equations.
Hope this works!
  댓글 수: 1
Donovan Allum
Donovan Allum 2023년 7월 27일
편집: Donovan Allum 2023년 7월 30일
Unfortunately this does not work. But I did manage to figure out it out, I think. I used griddedInterpolant and it appeared to work, at least to two dimensions. I was able to interpolate from a 2D set of points to a 1D vector, which is essentially what I was trying to do in my question. Thanks for the help anyway!
This is just from memory as I am adding this a few days later but it was something like this.
load('Data.mat','Data','x','y','z') %The 3D data I started with, with grid vectors
[X,Y,Z] = meshgrid(x,y,z);
r = 1; %radius of cylindrical shell
theta = linspace(0,pi/2,1000); %azimuthal angle passing from theta = 0 (where y=0) to theta = pi/2 (where x=0)
F = griddedInterpolant(X,Y,Z,Data);
for ii=1:length(z)
NewData(:,ii) = F(r.*cos(theta),r.*sin(theta),z(ii));
end
%New data is a profile along the arc at radius r from the origin (x,y,z) = (0,0,0)

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Logical에 대해 자세히 알아보기

제품


릴리스

R2023a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by