Maybe slightly off-topic, but it looks like you're using temp as a (1, 3)
Array, rather than a (3, 3).
On Wednesday, November 19, 2014 10:09:49 AM UTC+9, Ryan Young wrote:
>
> Hello,
>
> I am new to julia and am working on some neuroimaging analysis. I have a
> function that calculates the Jacobian of the deformation field at each
> point in the deformation field. A qr decomposition is then done on the
> Jacobian. The principle eigenvector of the strain portion of the QR
> decomposition is rotated, stored in an array and returned.
>
> I was not going to parallelize this function as I think it is easier to do
> a pmap of this process over all of the samples. Currently, this is taking a
> few minutes to run on one large deformation field (225,425,225,3). All the
> time is being taken up in the last three lines of the for loop. Any advice
> is greatly appreciated.
>
> Thanks
> Ryan
>
>
> function calcJac(deformation::Array{Float32,4})
> temp=Array(Float32,3,3)
> r=Array(Float32,3,3)
> s=Array(Float32,3,3)
> ev=Array(Float32,3,3)
>
> i,j,k=size(deformation)
> final=Array(Float32,i,j,k,3)
>
> for x in 3:i-3
> for y in 3:j-3
> for z in 3:k-3
>
> #compute frist row of jacobain
>
> temp[1,1]=(-deformation[x+2,y,z,1]+8*deformation[x+1,y,z,1]-8*deformation[x-1,y,z,1]+deformation[x-2,y,z,1])/12.0
>
> temp[1,2]=(-deformation[x+2,y,z,2]+8*deformation[x+1,y,z,2]-8*deformation[x-1,y,z,2]+deformation[x-2,y,z,2])/12.0
>
> temp[1,3]=(-deformation[x+2,y,z,3]+8*deformation[x+1,y,z,3]-8*deformation[x-1,y,z,3]+deformation[x-2,y,z,3])/12.0
>
> #compute 2nd row of jacobian
>
> temp[1,1]=(-deformation[x,y+2,z,1]+8*deformation[x,y+1,z,1]-8*deformation[x,y-1,z,1]+deformation[x,y-2,z,1])/12.0
>
> temp[1,2]=(-deformation[x,y+2,z,2]+8*deformation[x,y+1,z,2]-8*deformation[x,y-1,z,2]+deformation[x,y-2,z,2])/12.0
>
> temp[1,3]=(-deformation[x,y+2,z,3]+8*deformation[x,y+1,z,3]-8*deformation[x,y-1,z,3]+deformation[x,y-2,z,3])/12.0
>
> #compute third row of jacobian
>
> temp[1,1]=(-deformation[x,y,z+2,1]+8*deformation[x,y,z+1,1]-8*deformation[x,y,z-1,1]+deformation[x,y,z-2,1])/12.0
>
> temp[1,2]=(-deformation[x,y,z+2,2]+8*deformation[x,y,z+1,2]-8*deformation[x,y,z-1,2]+deformation[x,y,z-2,2])/12.0
>
> temp[1,3]=(-deformation[x,y,z+2,3]+8*deformation[x,y,z+1,3]-8*deformation[x,y,z-1,3]+deformation[x,y,z-2,3])/12.0
>
> r,s=qr(temp)
> ev=eigvecs(s)
> final[x,y,z,:]=r*ev[:,1]
>
> end
> end
> end
>
> return final
> end
>