Using parfor to evaluate integrations
4 次查看(过去 30 天)
显示 更早的评论
Probably a stupid question.
I want to integrate a function f(x,y). Can I use parfor() as shown below to compute the sum? I am confused because I consider that each loop over one "ix" value in the following parfor() is run independently from other "ix" values, which means that I must obtain a different "sum_f" for each "ix" value. Right?
clear; clc;
xmin = -2; xmax = 1;
ymin = 1; ymax = 3;
dx = 0.001;
dy = dx;
xs = xmin:dx:xmax; Nx = length(xs);
ys = ymin:dy:ymax; Ny = length(ys);
f = @(x,y) x^2+y^2;
sum_f = 0;
parfor ix = 1:Nx
x = xs(ix);
for iy = 1:Ny
y = ys(iy);
sum_f = sum_f + f(x,y)*dx*dy;
end
end
I = sum(sum_f(:))
2 个评论
Dyuman Joshi
2024-2-2
Any particular reason why you are using a double for loop, instead of vectorizing the function handle and the sum?
采纳的回答
Dyuman Joshi
2024-2-2
移动:Hans Scharler
2024-2-2
xmin = -2; xmax = 1;
ymin = 1; ymax = 3;
dx = 0.001;
dy = dx;
xs = xmin:dx:xmax; Nx = length(xs);
ys = ymin:dy:ymax; Ny = length(ys);
%vectorizing the function handle
f = @(x,y) x.^2+y.^2;
tic
sum_f = 0;
for ix = 1:Nx
x = xs(ix);
for iy = 1:Ny
y = ys(iy);
sum_f = sum_f + f(x,y)*dx*dy;
end
end
I1 = sum(sum_f(:))
toc
tic
I2 = sum(f(xs,ys.').*dx.*dy, 'all')
toc
%Using tolerance to compare floating point numbers
abs(I1-I2)<1e-10
2 个评论
Mike Croucher
2024-2-5
Ahhh loops vs vectors....my old friend. We meet again.
I'm going to let you in on a secret......sometimes loops are faster!
- Original loop with a function call: 0.218 seconds
- Optimised loop with function call removed: 0.025 seconds
- vectorised loop: 0.0275 seconds
So here, my loop version is slightly faster than the vectorised version. What you see might be dependent on machine, problem size and MATLAB version
Observe:
xmin = -2; xmax = 1;
ymin = 1; ymax = 3;
dx = 0.001;
dy = dx;
xs = xmin:dx:xmax; Nx = length(xs);
ys = ymin:dy:ymax; Ny = length(ys);
%vectorizing the function handle
f = @(x,y) x.^2+y.^2;
tic
sum_f = 0;
for ix = 1:Nx
x = xs(ix);
for iy = 1:Ny
y = ys(iy);
sum_f = sum_f + f(x,y)*dx*dy;
end
end
I1 = sum(sum_f(:))
toc
disp('Inline the function call in the loop')
xmin = -2; xmax = 1;
ymin = 1; ymax = 3;
dx = 0.001;
dy = dx;
xs = xmin:dx:xmax; Nx = length(xs);
ys = ymin:dy:ymax; Ny = length(ys);
tic
sum_f = 0;
for ix = 1:Nx
x = xs(ix);
for iy = 1:Ny
y = ys(iy);
sum_f = sum_f + (x.^2+y.^2)*dx*dy;
end
end
I1 = sum(sum_f(:))
toc
disp('vectorised version')
tic
I2 = sum(f(xs,ys.').*dx.*dy, 'all')
toc
更多回答(0 个)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Data Type Identification 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!