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.

 Respuesta aceptada

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 comentarios

Thanks Walter,
Your first suggestion help me little bit to reduce the time from 32.58 sec to 32.04 sec.
You would be able to achieve better performance if your Data had N_proj as its _last_ index instead of its first.
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.

Iniciar sesión para comentar.

Más respuestas (1)

Rami
Rami el 11 de Nov. de 2011
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

Categorías

Etiquetas

Preguntada:

el 11 de Nov. de 2011

Community Treasure Hunt

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

Start Hunting!

Translated by