How to reduce the computation time for adding 3D-array?
4 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
jae lee
am 9 Dez. 2020
Kommentiert: Bruno Luong
am 7 Jan. 2021
Hi, I am trying to add multiple 3D-arrays to a bigger 3D-array at a specific index (x,y,z)
Below is the code, and it does work and compute the answer but it seems very ineffecient.
In this example, i only have 4 sets of coordiantes (x,y,z) but in real code, i have more than 1e6 sets of points.
It takes very long to compute the result with that many points.
Is there any way to reduce the computation time?
Thank you in advance
Regards
J
Big=zeros(500,500,500); %%%% Bigger Array
Small=rand(250,250,250);
x=[245; 220; 256; 270];
y=[245; 220; 256; 270];
z=[245; 220; 256; 270];
for n = 1 : length(x)
x_cord=x(n)-length(Small)/2;
y_cord=y(n)-length(Small)/2;
z_cord=z(n)-length(Small)/2;
x_end= x_cord + length(Small) -1 ;
y_end= y_cord + length(Small) -1;
z_end=z_cord + length(Small) -1;
if x_end <= length(Big)
Big(x_cord:x_end, y_cord:y_end,z_cord:z_end)=Big(x_cord:x_end, y_cord:y_end,z_cord:z_end)+Small();
end
end
2 Kommentare
Walter Roberson
am 9 Dez. 2020
could also be done with accumarray, but I am not sure that would be faster considering the time to generate the coordinate matrices... though I did just think of a shortcut for that.
Akzeptierte Antwort
Bruno Luong
am 24 Dez. 2020
Bearbeitet: Bruno Luong
am 24 Dez. 2020
You can reformulate the loop as convolution of
A = accumarray([x(:) y(:) z(:)]-length(Small)/2,1,[500 500 500])
and
B = flip(flip(flip(Small,1),2),3)
(I left out the detail of overflowed for simplicity)
You might look at convn function. The problem I see is that A is sparse (1/125 in density) and might not be efficient as for loop.
You also might try this FEX to see if you can exploit the sparsity
Or this one using different method of compute convolution
5 Kommentare
Bruno Luong
am 7 Jan. 2021
You might try the alternative convolution implementations in the links I post above.
As I said above, the alternative ways I have proposed might not be fater than your for-loop.
Weitere Antworten (1)
Amrtanshu Raj
am 24 Dez. 2020
Hi,
You can use the parfor loop to use parallel processing and get higher computation speeds. However you will have to modify your for loop to be used for parfor loop.
Hope this helps !!
0 Kommentare
Siehe auch
Kategorien
Mehr zu Loops and Conditional Statements finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!