speeding up nested for loops
3 次查看(过去 30 天)
显示 更早的评论
I have a couple of nested for loops that take a very long time to calculate. Basically they look like:
for x= 1:Nx
for y = 1:Ny
f(x,y) = A(x+1,y+1) + B(x-1,y+1) + C(x+1,y-1) + D(x-1,y-1);
end
end
Ideally I would like to be able to compute this in parallel because f(x+1,y) doesn't not depend on f(x,y) and the same for the y values. But it appears that I can't do nested parfor loops. Is there any way I can do this calculation in parallel?
(A, B, C, and D are all defined previously in the code)
3 个评论
per isakson
2014-8-8
编辑:per isakson
2014-8-8
This will cause a error
x = 1;
B(x-1,y+1)
What are the sizes of A, B, C and D?
回答(2 个)
Nir Rattner
2014-8-8
编辑:Nir Rattner
2014-8-8
I'm assuming A, B, C, and D are functions considering the 0 valued arguments.
Typically, vectorizing your code should be a first step before using “parfor”. It would be best to simply vectorize the functions themselves, but if you can’t then you can use “meshgrid” and “arrayfun”:
[x, y] = meshgrid(1 : Nx, 1 : Ny);
Aout = arrayfun(@A, x + 1, y + 1);
Bout = arrayfun(@B, x - 1, y + 1);
Cout = arrayfun(@C, x + 1, y - 1);
Dout = arrayfun(@D, x - 1, y - 1);
f = Aout + Bout + Cout + Dout;
If you do prefer to use “parfor”, then you can coalesce the indices of the loops:
parfor xy = 1 : (Nx * Ny)
x = xy / (Nx * Ny);
y = xy % (Nx * Ny);
f(x,y) = A(x+1,y+1) + B(x-1,y+1) + C(x+1,y-1) + D(x-1,y-1);
end
A Jenkins
2014-8-8
What about vectorizing it? Just replace x with 1:Nx, and y with 1:Ny to get rid of the for loops completely:
f = A((1:Ny)+1,(1:Ny)+1) + B((1:Ny)-1,(1:Ny)+1) + C((1:Ny)+1,(1:Ny)-1) + D((1:Ny)-1,(1:Ny)-1)
(Also how is your code handling zero indices? For example when x and y are 1, you would be getting B(0,2)...)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Loops and Conditional Statements 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!