-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathspm_field.m
75 lines (72 loc) · 3.3 KB
/
spm_field.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
function varargout = spm_field(varargin)
% A compiled routine for various spatially regularised inverse problems.
%_______________________________________________________________________
%
% FORMAT v = spm_field(H, g, param)
% v - the solution (n1*n2*n3*n4, single)
% H - parameterisation of a Hessian at each voxel
% (n1*n2*n3*(n4*(n4-1)), single)
% Because the Hessian is symmetric, elements along the
% 4th dimension are ordered:
% h(1,1), h(2,2), h(3,3),... h(1,2), h(1,3), ..., h(2,3)...
% Each vector along the 4th dimension should encode a
% positive (semi)definite matrix.
% g - parameterisation of first derivatives (n1*n2*n3*n4, single)
% param - 10 parameters (settings)
% - [1][2][3] Voxel sizes
% - [4][5][6] Regularisation settings.
% - [4] Penalty on absolute values.
% - [5] Penalty on the `membrane energy'. This penalises
% the sum of squares of the gradients of the values.
% - [6] Penalty on the `bending energy'. This penalises
% the sum of squares of the 2nd derivatives.
% - [7] Number of Full Multigrid cycles.
% - [8] Number of relaxation iterations per cycle.
%
% The function solves equations using a Full Multigrid method (see
% Press et al for more information), but incorporating the Hessian
% of some form of likelihood term.
% v = inv(A+B)*g
% where A = param(4)*I + param(5)*L + param(6)*L'*L
% and I = kron(kron(Iz,Iy),Ix)
% L = kron(kron(Lz,Iy),Ix) + kron(kron(Iz,Ly),Ix) + kron(kron(Iz,Iy),Lx)
%
% Ix = eye(n1); Iy = eye(n2); Iz = eye(n3)
% Lx = toeplitz([2 -1 0 ... 0 -1]/param(1)^2) etc
%
% Note that for ill-conditioned A, some regularisation of the solution
% is included. This means that the solution is not identical to that
% computed using other methods, it is still appropriate for use in
% Gauss-Newton type optimisation schemes.
% _______________________________________________________________________
%
% FORMAT u = spm_field('vel2mom', v, param)
% v - A field (n1*n2*n3*n4, single).
% param - 6 parameters (settings)
% - [1][2][3] Voxel sizes
% - [4][5][6] Regularisation parameters
% u - Result of applying differential operator (n1*n2*n3*n4, single).
%
% This generates u = A*v, where A is computed as described above.
% _______________________________________________________________________
%
% FORMAT b = spm_field('boundary')
% Get the current boundary condition.
% b - boundary condition
% 0 - field wraps around at the boundary, as if the field is on a
% torus (circulant). This is typically assumed when using
% FFTs for convolution etc.
% 1 - Neumann boundary condition.
% Note that after a `clear functions' in MATLAB, the boundary
% condition is reset to 0.
% _______________________________________________________________________
%
% FORMAT spm_field('boundary',b)
% Set the boundary condition.
% b - boundary condition (0 or 1, see above).
%_______________________________________________________________________
% Copyright (C) 2012 Wellcome Trust Centre for Neuroimaging
% John Ashburner
% $Id: spm_field.m 5981 2014-05-13 12:47:14Z john $
%-This is merely the help file for the compiled routine
error('spm_field.c not compiled - see Makefile')