-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathspm_dwtmtx.m
73 lines (62 loc) · 2.15 KB
/
spm_dwtmtx.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
function H = spm_dwtmtx(N,K,T)
% Create basis functions for Discrete (Haar) Wavelet Transform
% FORMAT H = spm_dwtmtx(N,K,T)
%
% N - dimension
% K - order: number of basis functions = N/K
%
% T - option flag for thinning eccentric wavelets [default: false]
%__________________________________________________________________________
%
% spm_dwtmtx creates a matrix for the first few basis functions of a one
% dimensional Haar Discrete Wavelet transform.
%__________________________________________________________________________
% Copyright (C) 2011-2015 Wellcome Trust Centre for Neuroimaging
% Karl Friston
% $Id: spm_dwtmtx.m 6416 2015-04-21 15:34:10Z guillaume $
% Create basis set
%==========================================================================
try, T; catch, T = false; end
K = max(K,1);
H = ones(N,1);
I = 1;
while ~isempty(I)
% Find non-zero elements and create new bases
%----------------------------------------------------------------------
j = find(H(:,I(1)) > 0);
k = find(H(:,I(1)) < 0);
nj = length(j);
nk = length(k);
hj = sparse(1:fix(nj/2),1,2,nj,1) - 1;
hk = sparse(1:fix(nk/2),1,2,nk,1) - 1;
% Add new columns if there are enough elements
%----------------------------------------------------------------------
if nj > K
H(j,end + 1) = hj;
I(end + 1) = size(H,2);
end
if nk > K
H(k,end + 1) = hk;
I(end + 1) = size(H,2);
end
% This column has now been expanded
%----------------------------------------------------------------------
I(1) = [];
end
% Thin eccentric basis functions
%==========================================================================
if T
% indices of column (bases) to retain
%----------------------------------------------------------------------
j = logical(H(:,1));
for i = 1:length(j);
k = find(H(:,i));
l = length(k);
if any(k < (N/2 - 2*l)) || any(k > (N/2 + 2*l))
j(i) = 0;
end
end
% thin
%----------------------------------------------------------------------
H = H(:,j);
end