How can speed up the program while reshaping 600 projections

Hi,
For CT reconstruction, I am reshaping each projection (600 projections) as row matrices. The program is really slow as I am using loop to read the Data(proj,row,col) and pickup row and column for each projection and reshape it.
for N_proj = 1:600 %NumProj,
proj(N_proj).sector = squeeze(Data(N_proj,:,:)); %%retrieval of projection data N x N matrix
proj(N_proj).sector = reshape(proj(N_proj).sector, 1, N_col*N_row); %%row matrix
new_proj = zeros(N_proj,N_col,N_row);
end
This is working, but little slow. Is there possibility to improve the program.

 採用された回答

Walter Roberson
Walter Roberson 2011 年 11 月 11 日

1 投票

squeeze() does not change the data order, just the indexing.
reshape() to a row vector does not change the data order, just the indexing.
Therefore, your code can be rewritten as either
proj(N_proj).sector = reshape(Data(N_proj,:,:), 1, N_col*N_row);
or as
t = Data(N_proj,:,:);
proj(N_proj).secdtor = t(:).';

3 件のコメント

Rami
Rami 2011 年 11 月 14 日
Thanks Walter,
Your first suggestion help me little bit to reduce the time from 32.58 sec to 32.04 sec.
Walter Roberson
Walter Roberson 2011 年 11 月 14 日
You would be able to achieve better performance if your Data had N_proj as its _last_ index instead of its first.
Walter Roberson
Walter Roberson 2011 年 11 月 14 日
Indeed, if your Data had the projection number as the last index, then no reshaping would be necessary: it would all be indexing of consecutive bits of memory. Not only that, but the whole operation could probably be coded as a cell2struct(mat2cell()) call... though it is not clear that that would be any faster than a for loop.
Do you have enough free memory to experiment with a permute() of Data? let me think, [2 3 1] I guess would be the permutation. I am not certain that doing that followed by indexing along the third dimension would necessarily be faster than what you have now -- but if you could consistently store and index the data with the projection number last, that would likely speed up your entire program.

サインインしてコメントする。

その他の回答 (1 件)

Rami
Rami 2011 年 11 月 11 日

0 投票

Please find following as command lines as in original question it was not clear format
for N_proj = 1:600
proj(N_proj).sector = squeeze(Data(N_proj,:,:)); %% retrieval of projection data N x N matrix
proj(N_proj).sector = reshape(proj(N_proj).sector, 1, N_col*N_row);
end
Thanks, Rami

カテゴリ

ヘルプ センター および File Exchange で Multidimensional Arrays についてさらに検索

タグ

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by