How to modify loop code for 3D data?

조회 수: 2 (최근 30일)
Ahmed
Ahmed 2024년 3월 5일
편집: Daniel 2024년 3월 5일
For 2D data when sizes or dimensions of v1, v2, r are 116 227, I used following code to compute data:
ti = 1 * 116
dt = ti(2)-ti(1);
nt = 116;
f0 = 30; %t = TWT;
t0 = 2/f0;
[wa,t] = wvlt(f0, t0, nt, dt);
w = w.'; t0_i = floor(t0/dt);
time = ti;
w = repmat(w, 1, 227);
%% Angles
ang = [15 30 45];
TH = ang*pi/180;
%% Forward model
for i = 1:size(v1,2)
for k = 1:length(TH)
data{i,k} = fwmod_v(v1(:,i),v2(:,i),r1(:,i),TH(k),w,t0,dt);
end
end
Now I want to modify the cde for 3D data of size
v1 = 176 139 48 i.e. 176 numb of vertical layers, 139 is horizontal traces and 48 are vertical slice each has 176 layers and 139 traces.
v2 = 176 139 48
r = 176 139 48
For 3D case how I can modify the above code?
Function
function [syn] = fwmod_v(v1,v2,r,TH,w,t0,dt)
t0_i = floor(t0/dt);
Nl = length(v1);
trc = AKR(v1,2s,r,TH);
syn = conv2(w, trc);
syn = syn(1+t0_i:Nl+t0_i,:);
function Rpp = AKR(v1, v1, r, TH)
Nt = length(v1);
Nth = length(TH);
R = zeros(Nt,Nth);
sin2 = sin(TH).^2;
tan2 = tan(TH).^2;
for i = 1:Nt-1
dvp = v1(i+1) - v1(i);
dvs = v2(i+1) - v2(i);
drho = r(i+1) - r(i);
vpm = (v1(i+1) + v1(i))/2;
vsm = (v1(i+1) + v1(i))/2;
rhom = (r(i+1) + r(i))/2;
R(i,:) = 0.5*(1 + (tan2)).*(dvp/vpm) - 4*(((vsm/vpm)^2)*dvs/vsm).*sin2 + 0.5*(1 -4*((vsm/vpm)^2).*sin2)*(drho/rhom);
end
  댓글 수: 2
Daniel
Daniel 2024년 3월 5일
I don't think there's enough information here to answer the question. AKR isn't a standard MATLAB function as far as I can tell, and there are some typos in the fwmod_v definition (e.g. "2s" is incorrect syntax). What is AKR supposed to do?
Ahmed
Ahmed 2024년 3월 5일
@Daniel AKR function is now added in the question. Plz see

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

답변 (1개)

Daniel
Daniel 2024년 3월 5일
Based on what I can see, it looks like you're performing processing along one column of input data at a time. To amend that for 3D v1 and v2, you would just add a second layer to your for loop, so that you're iterating along both dimension 2 and dimension 3.
So you could add a for j = 1:size(v1,3) after your for i = ... line, and add an extra dimension to data and an additional layer of indexing to v1 and v2, such that that line becomes
data{i,j,k} = fwmod_v(v1(:,i,j),v2(:,i,j),r1(:,i,j),TH(k),w,t0,dt);
Does that work syntactically and do what you need?
  댓글 수: 2
Ahmed
Ahmed 2024년 3월 5일
@Daniel if i can explain is there are 48 vertical slices and every slice have 139 columns. for one process it takes 1 column of each v1 v2 and r and second of v1 v2 and r. It computes three traces at three TH (angles) for each set of v1 v2 r.
For 1 vertical slice (out of 48), there are 139 coulumns and for 1 coulumns of out of 139, there is a set of size 176 3 (which is one data)
Daniel
Daniel 2024년 3월 5일
편집: Daniel 2024년 3월 5일
@Ahmed, so you want to continue passing in a 176-element vector, then? If so, I think what I outlined above should be correct. The extra "for j = ..." line I suggested will iterate along your new "vertical slice" dimension, and then indexing v1(:,i,j) will extract a full column vector (or vertical layer). Then you'll pass the output (which should have the same dimension it had before) into your data cell array, which will now have three indices: i for your horizontal trace, then j for your vertical slice, then k for your angle. Each element in data (i.e. data{i,j,k}) will itself contain a full (scalar, vector, or matrix) output of a single fwmod_v call.

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

카테고리

Help CenterFile Exchange에서 Data Type Conversion에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by