How can speed up the program while reshaping 600 projections

2 ビュー (過去 30 日間)
Rami
Rami 2011 年 11 月 11 日
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 日
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 件のコメント
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 日
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

カテゴリ

Help Center および File ExchangeResizing and Reshaping Matrices についてさらに検索

タグ

Community Treasure Hunt

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

Start Hunting!

Translated by