how to run nested for loop efficiently on 3d matrix ?
古いコメントを表示
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 件のコメント
Walter Roberson
2019 年 1 月 23 日
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
2019 年 1 月 23 日
Vinny
2019 年 1 月 23 日
Walter Roberson
2019 年 1 月 23 日
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
2019 年 1 月 23 日
vectorize your matrix
Jan
2019 年 1 月 23 日
@Vinny: Please post your code. How can the readers suggest an improvement without seeing the current state?
回答 (0 件)
カテゴリ
ヘルプ センター および File Exchange で Parallel for-Loops (parfor) についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!