How to modify the code to compute data on multiple inputs?

3 次查看(过去 30 天)
Hi,
I have attached the snap of my code, I am computing data by using vp vs and rho each of size 116 * 227. The data should be computed as e.g., data1 from vp(:,1), vs(:,1) and rho(:,1) on three theta (15 30 45) and then in the next stage: data2 from vp(:,2), vs(:,2) and rho(:,2) on three theta (15 30 45) and so on... until 227.
How can I adjust my code to perform like this? It means I should have 227 set of output data each have three traces at three theta values (as theta are 15 30 45).
  1 个评论
Jo
Jo 2024-2-4
Certainly! Here's a shorter version:
  1. Function Signature:Update the function signature to accept multiple inputs.python
  • def your_function(*inputs):
# existing code
  • Loop or Iterate:If inputs are iterable, loop through them.python
  • def process_multiple_inputs(inputs):
for input_data in inputs:
# process input_data
  • Parallel Processing:For parallel processing, consider using concurrent.futures.python
  • from concurrent.futures import ThreadPoolExecutor
def process_inputs_parallel(inputs):
with ThreadPoolExecutor() as executor:
results = list(executor.map(process_function, inputs))
  • Modularization:Break code into smaller functions for readability.python
  1. def process_input(input_data):
# process individual input
def process_multiple_inputs(inputs):
results = [process_input(data) for data in inputs]
Adjust the suggestions based on your specific code and requirements.

请先登录,再进行评论。

采纳的回答

VBBV
VBBV 2024-2-4
编辑:VBBV 2024-2-4
theta = [15 30 45];
for i = 1:227 % size(vp,2)
for k = 1:length(theta)
data{i,k} = fwmod_vpvsrho(vp(:,i),vs(:,i),rho(:,i),theta(k),wav,t0,dt)
end
end
An alternate way is to use double for loop which considers the 227 output values in vector for each theta
  10 个评论
VBBV
VBBV 2024-2-5
编辑:VBBV 2024-2-5
You can modify the code as below. Note that gather is cell array created for datasets of size 116 x 3. So you must use a curly brace like { } instead of parenthesis ( )
SNR = 20; % add noise
for K = 1:227
% Assuming gather(K) is a cell array
currentMatrix = gather{K};
% Extract the first column
Snear(:, K) = currentMatrix(:, 1); % first theta
Smid(:, K) = currentMatrix(:, 2); % second theta
Sfar(:, K) = currentMatrix(:, 3); % third theta
% Adding Noise
seis = var(gather{K});
var_noise = var(gather{K})./SNR;
std_noise = sqrt(seis./SNR);
Noise_data1 = data{K,1} + std_noise.*randn(size(data{K,1})); % first theta
Noise_data2 = data{K,2} + std_noise.*randn(size(data{K,2})); % second theta
Noise_data3 = data{K,3} + std_noise.*randn(size(data{K,3})); % third theta
Noise_gather{K} = [Noise_data1 Noise_data2 Noise_data3] ;
end
Regarding the adding of noise data, the code can be modified as above. Also note that, you aleady have variable named gather so use a different variable name for gathering noise data e.g. Noise_gather
Ahmed
Ahmed 2024-2-6
编辑:Ahmed 2024-2-6
@VBBV Thanks and there is an error here:
Because size of std_noise is 1 3 and size of randn(size(data{K,1})) = 116 227.
Matrix dimensions must agree.
Error in M_2D_Forward (line 63)
Noise_data1 = data{K,1} + std_noise.*randn(size(data{K,1})); % first theta

请先登录,再进行评论。

更多回答(1 个)

Aquatris
Aquatris 2024-2-3
编辑:Aquatris 2024-2-3
Next time please copy paste the code, not screen shot :D
You did not provide full info to get an answer since I have no idea how fwmod_vpvsrho function you have.
Having said that you can either modify your fwmod_vpvsrho function to allow an array inputs for theta variable or you can do:
for i = 1:length(theta)
data(:,:,i) = fwmod_vpvsrho(vp,vs,rho,theta(i),wav,t0,dt)
end
WIth this data(:,:,i) refers to the data at theta(i). so the data variable is a 116x227x3 matrix.
  1 个评论
Ahmed
Ahmed 2024-2-4
@Aquatris Thaks, but the oupt this way is 227x227x3 instead of 116x227x3?
This is code given below. How can I read all 227 datasets separately as data1 = 116x3?
load('Modell.mat','vp','vs','rho')
rho = rho.*1000;
vs(vs==0) = 100;
ip = vp.*rho; is = vs.*rho;
load('time.mat','ti');
Travel_min = 2.0; Travel_max = 2.2;
ti = linspace(Travel_min,Travel_max,116)';
ti = ti';
%% Wavelet
dt = ti(2)-ti(1);
nt = 116;
f0 = 30; %t = TWT;
t0 = 2/f0;
[wav,t] = Ricker(f0, t0, nt, dt);
wav = wav.'; t0_i = floor(t0/dt);
time = ti; %figure, plot(wav)
wav = repmat(wav, 1, 227);
%% Angles
angles = [15 30 45];
theta = angles*pi/180;
%% Forward model
for i = 1:length(theta)
data(:,:,i) = fwmod_vpvsrho(vp,vs,rho,theta(i),wav,t0,dt);
end
% Functions
function [synth] = fwmod_vpvsrho(vp,vs,rho,theta,wav,t0,dt)
t0_i = floor(t0/dt);
Nl = length(vp);
trc = Aki_Richards(vp,vs,rho,theta);
synth = conv2(wav, trc);
synth = synth(1+t0_i:Nl+t0_i,:);
function Rpp = Aki_Richards(vp, vs, rho, theta)
Nt = length(vp);
Ntheta = length(theta);
Rpp = zeros(Nt,Ntheta);
sin2 = sin(theta).^2;
tan2 = tan(theta).^2;
for i = 1:Nt-1
dvp = vp(i+1) - vp(i);
dvs = vs(i+1) - vs(i);
drho = rho(i+1) - rho(i);
vpm = (vp(i+1) + vp(i))/2;
vsm = (vs(i+1) + vs(i))/2;
rhom = (rho(i+1) + rho(i))/2;
Rpp(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

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 Debugging and Analysis 的更多信息

Community Treasure Hunt

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

Start Hunting!

Translated by