how to run nested for loop efficiently on 3d matrix ?
Show older comments
I have a big 3d matrix of size (2000,700,300) for which I want to run a nested for loop on .
the loop will be spatially only, meaning i goes 1:2000 and j 1:700 , pixel by pixel.
the thing is , it takes a very very long time.
is there a way to speed this up? I have tried parfor but it only makes it slower ...
i have a strong gpu if that helps.
also , I thought of using functions like nlfilter or blockproc , but they only take a picture of 1 or 3 dimensions as an argument.
7 Comments
Walter Roberson
on 23 Jan 2019
What does the computation do ? That is going to determine whether it is suitable for GPU conversion.
For gpu use, you would probably want to do something like
temp = permute(reshape(YourMatrix, [], size(YourMatrix,3)), [2 3 1]);
this rearranges you first 2 dimensions into a vector, the moves the third dimension to the first and the first to the third... giving you a 300 x 1 x 1400000 array. You can then pagefun() that to have each 300 x 1 treated as a group.
Vinny
on 23 Jan 2019
Vinny
on 23 Jan 2019
Walter Roberson
on 23 Jan 2019
If each band is to be processed separately then you could potentially use pagefun() on the original matrix if your algorithm could be run on a GPU.
However, it might be tricky to compute your algorithm in a GPU friendly way. Explicit indexing element by element is bad news on a GPU: you need vectorized algorithms.
Muhammad Usama
on 23 Jan 2019
vectorize your matrix
Jan
on 23 Jan 2019
@Vinny: Please post your code. How can the readers suggest an improvement without seeing the current state?
Answers (0)
Categories
Find more on Parallel for-Loops (parfor) in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!