-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathspm_sample_priors8.m
80 lines (77 loc) · 2.4 KB
/
spm_sample_priors8.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
76
77
78
79
80
function [s,ds1,ds2,ds3] = spm_sample_priors8(tpm,x1,x2,x3)
% Sample prior probability maps
% FORMAT [s,ds1,ds2,ds3] = spm_sample_priors8(tpm,x1,x2,x3)
% b - a cell array containing the tissue probability
% data (see spm_load_priors)
% x1,x2,x3 - coordinates to sample
% s - sampled values
% ds1,ds2,ds3 - spatial derivatives of sampled values
%
% This function is intended to be used in conjunction with spm_load_priors.
% V = spm_vol(P);
% T = spm_load_priors(V);
% B = spm_sample_priors(T,X,Y,Z);
%__________________________________________________________________________
% Copyright (C) 2008-2014 Wellcome Trust Centre for Neuroimaging
% John Ashburner
% $Id: spm_sample_priors8.m 5962 2014-04-17 12:47:43Z spm $
deg = tpm.deg;
tiny = tpm.tiny;
d = size(tpm.dat{1});
dx = size(x1);
Kb = numel(tpm.dat);
s = cell(1,Kb);
msk1 = x1>=1 & x1<=d(1) & x2>=1 & x2<=d(2) & x3>=1 & x3<=d(3);
msk2 = x3<1;
x1 = x1(msk1);
x2 = x2(msk1);
x3 = x3(msk1);
if nargout<=1,
tot = zeros(dx);
for k=1:Kb,
a = spm_bsplins(tpm.dat{k},x1,x2,x3,[deg deg deg 0 0 0]);
s{k} = ones(dx)*tpm.bg2(k);
s{k}(msk1) = exp(a);
s{k}(msk2) = tpm.bg1(k);
tot = tot + s{k};
end
msk = ~isfinite(tot);
tot(msk) = 1;
for k=1:Kb,
s{k}(msk) = tpm.bg2(k);
s{k} = s{k}./tot;
end
else
ds1 = cell(1,Kb);
ds2 = cell(1,Kb);
ds3 = cell(1,Kb);
tot = zeros(dx);
for k=1:Kb,
[a,da1,da2,da3] = spm_bsplins(tpm.dat{k},x1,x2,x3,[deg deg deg 0 0 0]);
if k==Kb, s{k} = ones(dx); else s{k} = zeros(dx)+tiny; end
s{k} = ones(dx)*tpm.bg2(k);
s{k}(msk1) = exp(a);
s{k}(msk2) = tpm.bg1(k);
tot = tot + s{k};
ds1{k} = zeros(dx); ds1{k}(msk1) = da1;
ds2{k} = zeros(dx); ds2{k}(msk1) = da2;
ds3{k} = zeros(dx); ds3{k}(msk1) = da3;
end
msk = find(~isfinite(tot));
tot(msk) = 1;
da1 = zeros(dx);
da2 = zeros(dx);
da3 = zeros(dx);
for k=1:Kb,
s{k}(msk) = tpm.bg1(k);
s{k} = s{k}./tot;
da1 = da1 + s{k}.*ds1{k};
da2 = da2 + s{k}.*ds2{k};
da3 = da3 + s{k}.*ds3{k};
end
for k=1:Kb,
ds1{k} = s{k}.*(ds1{k} - da1); ds1{k}(msk) = 0;
ds2{k} = s{k}.*(ds2{k} - da2); ds2{k}(msk) = 0;
ds3{k} = s{k}.*(ds3{k} - da3); ds3{k}(msk) = 0;
end
end