how to run nested for loop efficiently on 3d matrix ?
Mostrar comentarios más antiguos
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 comentarios
Walter Roberson
el 23 de En. de 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
el 23 de En. de 2019
Vinny
el 23 de En. de 2019
Walter Roberson
el 23 de En. de 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
el 23 de En. de 2019
vectorize your matrix
Jan
el 23 de En. de 2019
@Vinny: Please post your code. How can the readers suggest an improvement without seeing the current state?
Respuestas (0)
Categorías
Más información sobre Parallel for-Loops (parfor) en Centro de ayuda y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!