Print

Print


Thanks Darren,

> The first problem caused by having 3D data is that loaddat doesn't
> load Ng (or Nf) because loops such as starting at line 221
> for k = 1:d(4)-1

I've now fixed that one by changing line 32 of spm_klaff.m to:

nd = min([df(4)+1,dg(4)]); % Use the first nd volumes.


> It turns out that for certain matrices, M, the values of x1, y1 or z1
> can be very close to but not quite > 1. This causes the subsequent
> lines (107-109)
> msk = x1>=1 & x1<=df(1) &...
>           y1>=1 & y1<=df(2) &...
>            z1>=1 & z1<=df(3);
>
> to generate an empty msk.

I don't think an empty mask should be a problem as there will be plenty of 
other planes of data containing information.  There may be a small loss of 
accuracy, but it would make things go ever so slightly faster.  Anyway, in my 
changes to the code, I've wrapped the necessary lines between an "if 
any(msk(:))" and "end" - just in case there are problems.  MATLAB can be a 
bit unpredictable in how it handles empty matrices.  For example, try:

size(zeros(0,3))
size([[] [] []])



> Around line 45 it says [x,y ,zz] = ndgrid(1:dg(1),1:dg(2),0);
> This will make zz all 0's, so I don't understand why at line 49 it is
> added to z and if it really should be all 0's?

spm_bsplins expects arguments 2, 3 and 4 to all have the same dimensions.  It 
would crash if I just passed a scalar rather than an array.

> Messing around with all of this doesn't lead to optimum convergence of
> dM and the resulting warped volumes end up being shifted and tiny...

This would depend on how things were messed around with, but there was an 
email to the list a few weeks ago where some wierd results were reported from 
this routine.  I haven't yet identified the cause of this problem.  For the 
affine registration, it is supposed to show a few numbers that indicate the 
convergence.  My attempt just produced:

Running 'Normalise to MNI Space'
** Affine registering "output" with MNI space **
  1          5.66208         0.103395
  2          3.98768         0.029183
  3         0.846455        0.0124364
  4         0.259187        0.0121146
  5        0.0922449        0.0121154
  6        0.0363161        0.0121065
  7         0.015159         0.012108
  8       0.00651621        0.0121074
  9       0.00284269        0.0121076
 10       0.00125002        0.0121075
 11      0.000552058        0.0121075
 12      0.000244923        0.0121075

The first column is the iteration number.  The last column is the objective 
function (KL-divergence), which is supposed to be minimised.  Notice that 
values can go slightly up as well as down (depending on the voxels included 
in msk).  The second column contains the sum of squares of the derivatives of 
the objective function w.r.t. the parameters.  This should approach zero at 
the minimum.

All the best,
-John