123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- function X = spm_orth(X,OPT)
- % Recursive Gram-Schmidt orthogonalisation of basis functions
- % FORMAT X = spm_orth(X,OPT)
- %
- % X - matrix
- % OPT - 'norm' for Euclidean normalisation
- % - 'pad' for zero padding of null space [default]
- %
- % Serial orthogonalisation starting with the first column
- %
- % Reference:
- % Golub, Gene H. & Van Loan, Charles F. (1996), Matrix Computations (3rd
- % ed.), Johns Hopkins, ISBN 978-0-8018-5414-9.
- %__________________________________________________________________________
- % Copyright (C) 2002-2012 Wellcome Trust Centre for Neuroimaging
-
- % Karl Friston
- % $Id: spm_orth.m 5821 2013-12-31 14:26:41Z karl $
-
- %-Default
- %--------------------------------------------------------------------------
- try
- OPT;
- catch
- OPT = 'pad';
- end
-
- %-Recursive Gram-Schmidt orthogonalisation
- %--------------------------------------------------------------------------
- sw = warning('off','all');
- [n,m] = size(X);
- X = X(:, any(X));
- rankX = rank(full(X));
- try
- x = X(:,1);
- j = 1;
- for i = 2:size(X, 2)
- D = X(:,i);
- D = D - x*(pinv(x)*D);
- if norm(D,1) > exp(-32)
- x = [x D];
- j(end + 1) = i;
- end
- if numel(j) == rankX, break, end
- end
- catch
- x = zeros(n,0);
- j = [];
- end
- warning(sw);
-
- % and normalisation, if requested
- %--------------------------------------------------------------------------
- switch OPT
- case{'pad'}
- X = zeros(n,m);
- X(:,j) = x;
- case{'norm'}
- X = spm_en(x);
- otherwise
- X = x;
- end
|