Simple Question about Optimization of Nested IF-FOR loops
Información
La pregunta está cerrada. Vuélvala a abrir para editarla o responderla.
Mostrar comentarios más antiguos
Does any one know how to optimize this code so that it runs faster:
for i=1:iNZ;
if iPointsinSlice>0;
for m=1:iNX;
for l=1:iNY;
if SliceMaskUr(m,l)==1;
DoseCubeU(m+(l-1)*iNX+i*iNX*iNY)=100*SumDose(m,l,i)/RX_Dose;
end
end
end
end
end
Your help is much appreciated! Thanks a lot!
Respuestas (5)
Roger Stafford
el 17 de Jun. de 2013
Is 'iPointsinSlice' a scalar? If so and if it is not positive, nothing will happen here.
Next, don't you mean "m+(l-1)*iNX+(i-1)*iNX*iNY" as the index to 'DoseCubeU'? As it stands it will vary from 1+iNX*iNY to iNX*iNY*iNZ+iNX*iNY. Assuming my guess is correct, do this:
if iPointsinSlice > 0
t = repmat(SliceMaskUr==1,1,1,iNZ);
DoseCubeU(t) = (100/RX_Dose)*SumDose(t);
end
In case 'iPointsinSlice' is not a scalar you will have to correct your code before we can see how to handle it.
1 comentario
Mohsen
el 17 de Jun. de 2013
Roger Stafford
el 17 de Jun. de 2013
Sorry! It should have been:
t = repmat(SliceMaskUr==1,[1,1,iNZ]);
1 comentario
Mohsen
el 18 de Jun. de 2013
Mohsen
el 17 de Jun. de 2013
4 comentarios
Roger Stafford
el 18 de Jun. de 2013
No, I wouldn't expect it to give the same result if you still use
DoseCubeU(m+(l-1)*iNX+i*iNX*iNY)
As I already pointed out, that indexes DoseCubeU starting, not with 1 but with 1+iNX*iNY and ends not with iNX*iNY*iNZ but iNX*iNY*iNZ+iNX*iNY. In my modification I assumed you didn't want to do that. Note that this has nothing to do with reshaping SumDose. It should work in that code without being reshaped. Using t as a single logical index will cause it to be interpreted as a linear index. Similarly in DoseCubeU the use of the single logical vector t will be interpreted by DoseCubeU as a linear index. Note that I have assumed that both DoseCubeU and SumDose are of sizes iNX-by-iNY-by-iNZ.
Mohsen
el 18 de Jun. de 2013
Mohsen
el 18 de Jun. de 2013
Mohsen
el 18 de Jun. de 2013
Andrei Bobrov
el 18 de Jun. de 2013
Editada: Andrei Bobrov
el 19 de Jun. de 2013
DoseCubeU = bsxfun(@times,100*SumDose/RX,SliceMaskUr==1);
ADD
s = SliceMaskUr(end:-1:1,end:-1:1);
tt = cumsum(cumsum(s),2);
t1 = flipud(any(tt,2));
t2 = fliplr(any(tt));
DoseCubeU = bsxfun(@times,100*SumDose(t1,t2,:)/RX_Dose,SliceMaskUr(t1,t2));
4 comentarios
Mohsen
el 18 de Jun. de 2013
Mohsen
el 18 de Jun. de 2013
Mohsen
el 18 de Jun. de 2013
Andrei Bobrov
el 19 de Jun. de 2013
Corrected. See ADD part in my answer.
La pregunta está cerrada.
Productos
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!