www.pudn.com > tsa.rar > adim.m


function [IR, CC, D] = adim(U, UC, IR, CC, arg5); 
% ADIM adaptive information matrix. Estimates the inverse 
%   correlation matrix in an adaptive way.  
% 
% [IR, CC] = adim(U, UC [, IR0 [, CC0]]);  
%   U 	input data   
%   UC 	update coefficient 0 < UC << 1 
%   IR0	initial information matrix 
%   CC0 initial correlation matrix
%   IR	information matrix (inverse correlation matrix) 
%   CC  correlation matrix
% 	 
%  The algorithm uses the Matrix Inversion Lemma, also known as  
%     "Woodbury's identity", to obtain a recursive algorithm.   
%     IR*CC - UC*I should be approx. zero.  
% 
% Reference(s): 
% [1] S. Haykin. Adaptive Filter Theory, Prentice Hall, Upper Saddle River, NJ, USA  
%     pp. 565-567, Equ. (13.16), 1996. 
 
 
%       $Revision: 1.4 $  
%       $Id: adim.m,v 1.4 2005/05/25 02:52:48 pkienzle Exp $
%       Copyright (C) 1998-2003 by Alois Schloegl 
%

%
% This library is free software; you can redistribute it and/or
% modify it under the terms of the GNU Library General Public
% License as published by the Free Software Foundation; either
% version 2 of the License, or (at your option) any later version.
% 
% This library is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
% Library General Public License for more details.
%
% You should have received a copy of the GNU Library General Public
% License along with this library; if not, write to the
% Free Software Foundation, Inc., 59 Temple Place - Suite 330,
% Boston, MA  02111-1307, USA.

 
[ur,p] = size(U); 
 
Mode_E = 1; 
%if nargin < 4, 
%        m  = zeros(size(U)+[0,Mode_E]); 
%end; 
 
if nargin<2, 
        fprintf(2,'Error ADIM: missing update coefficient\n'); 
        return; 
else	 
        if ~((UC > 0) & (UC <1)), 
                fprintf(2,'Error ADIM: update coefficient not within range [0,1]\n'); 
                return; 
        end; 
        if UC > 1/p, 
                fprintf(2,'Warning ADIM: update coefficient should be smaller than 1/number_of_dimensions\n'); 
        end; 
end; 
 
if nargin<3, 
        IR = []; 
end; 
if nargin<4, 
        CC = []; 
end; 
if nargin<5, 
        arg5 = 6; 
end; 
if isempty(IR), 
        IR = eye(p+Mode_E); 
end; 
if isempty(CC), 
        CC = eye(p+Mode_E); 
end; 
 
D = zeros(ur,(p+Mode_E)^2); 
%D = zeros(ur,1); 
W  = eye(p+Mode_E)*UC/(p+Mode_E); 
W2 = eye(p+Mode_E)*UC*UC/(p+Mode_E); 
 
for k = 1:ur, 
        if ~Mode_E, 
                % w/o mean term  
                d  = U(k,:);	 
        else 
                % w/ mean term  
                d  = [1,U(k,:)]; 
        end; 
         
        if ~any(isnan(d)), 
                CC = (1-UC)*CC + UC*(d'*d); 
                 
                %K = (1+UC)*IR*d'/(1+(1+UC)*d*IR*d'); 
                v  = IR*d'; 
                %K = v/(1-UC+d*v); 
                 
                if arg5==0;  		% original version according to [1], can become unstable  
                        IR = (1+UC)*IR - (1+UC)/(1-UC+d*v)*v*v'; 
                         
                elseif arg5==1;  	% this provides IR*CC == I, this seems to be stable  
                        IR = IR - (1+UC)/(1-UC+d*v)*v*v' + sum(diag(IR))*W; 
                         
                elseif arg5==6;  	% DEFAULT:  
                        IR = ((1+UC)/2)*(IR+IR') - ((1+UC)/(1-UC+d*v))*v*v'; 
                         
                        % more variants just for testing, do not use them.  
                elseif arg5==2; 
                        IR = IR - (1+UC)/(1-UC+d*v)*v*v' + sum(diag(IR))*W2; 
                         
                elseif arg5==3; 
                        IR = IR - (1+UC)/(1-UC+d*v)*v*v' + eps*eye(p+Mode_E); 
                         
                elseif arg5==4; 
                        IR = (1+UC)*IR - (1+UC)/(1-UC+d*v)*v*v' + eps*eye(p+Mode_E); 
                         
                elseif arg5==5; 
                        IR = IR - (1+UC)/(1-UC+d*v)*v*v' + eps*eye(p+Mode_E); 
                         
                end; 
        end; 
         
        %D(k) = det(IR); 
        D(k,:) = IR(:)'; 
end; 
 
IR = IR / UC; 
if Mode_E, 
        IR(1,1) = IR(1,1) - 1; 
end;