Noninvasive Fetal ECG: The PhysioNet/Computing in Cardiology Challenge 2013 1.0.0
(3,564 bytes)
%UT_TRANSFORM Perform unscented transform
%
% Syntax:
% [mu,S,C,X,Y,w] = UT_TRANSFORM(M,P,g,g_param,tr_param)
%
% In:
% M - Random variable mean (Nx1 column vector)
% P - Random variable covariance (NxN pos.def. matrix)
% g - Transformation function of the form g(x,param) as
% matrix, inline function, function name or function reference
% g_param - Parameters of g (optional, default empty)
% tr_param - Parameters of the transformation as:
% alpha = tr_param{1} - Transformation parameter (optional)
% beta = tr_param{2} - Transformation parameter (optional)
% kappa = tr_param{3} - Transformation parameter (optional)
% mat = tr_param{4} - If 1 uses matrix form (optional, default 0)
% X = tr_param{5} - Sigma points of x
% w = tr_param{6} - Weights as cell array {mean-weights,cov-weights,c}
%
% Out:
% mu - Estimated mean of y
% S - Estimated covariance of y
% C - Estimated cross-covariance of x and y
% X - Sigma points of x
% Y - Sigma points of y
% w - Weights as cell array {mean-weights,cov-weights,c}
%
% Description:
% ...
% For default values of parameters, see UT_WEIGHTS.
%
% See also
% UT_WEIGHTS UT_MWEIGHTS UT_SIGMAS
% Copyright (C) 2006 Simo S�rkk�
% 2010 Jouni Hartikainen
%
% $Id: ut_transform.m 482 2010-10-18 07:53:23Z jmjharti $
%
% This software is distributed under the GNU General Public
% Licence (version 2 or later); please refer to the file
% Licence.txt, included with the software, for details.
function [mu,S,C,X,Y,w] = ut_transform(M,P,g,g_param,tr_param)
if nargin < 4
g_param = [];
end
if nargin < 5
tr_param = [];
end
%
% Apply defaults
%
if isempty(tr_param)
alpha = [];
beta = [];
kappa = [];
mat = [];
X = [];
w = [];
else
alpha = tr_param{1};
if length(tr_param) >= 2
beta = tr_param{2};
else
beta = [];
end
if length(tr_param) >= 3
kappa = tr_param{3};
else
kappa = [];
end
if length(tr_param) >= 4
mat = tr_param{4};
else
mat = [];
end
if length(tr_param) >= 5
X = tr_param{5};
else
X = [];
end
if length(tr_param) >= 6
w = tr_param{6};
else
w = [];
end
end
if isempty(mat)
mat = 0;
end
%
% Calculate sigma points
%
if isempty(w) == 0
WM = w{1};
c = w{3};
if mat
W = w{2};
else
WC = w{2};
end
elseif mat
[WM,W,c] = ut_mweights(size(M,1),alpha,beta,kappa);
X = ut_sigmas(M,P,c);
w = {WM,W,c};
else
[WM,WC,c] = ut_weights(size(M,1),alpha,beta,kappa);
X = ut_sigmas(M,P,c);
w = {WM,WC,c};
end
%
% Propagate through the function
%
if isnumeric(g)
Y = g*X;
elseif ischar(g) | strcmp(class(g),'function_handle')
Y = [];
for i=1:size(X,2)
Y = [Y feval(g,X(:,i),g_param)];
end
else
Y = [];
for i=1:size(X,2)
Y = [Y g(X(:,i),g_param)];
end
end
if mat
mu = Y*WM;
S = Y*W*Y';
C = X*W*Y';
else
mu = zeros(size(Y,1),1);
S = zeros(size(Y,1),size(Y,1));
C = zeros(size(M,1),size(Y,1));
for i=1:size(X,2)
mu = mu + WM(i) * Y(:,i);
end
for i=1:size(X,2)
S = S + WC(i) * (Y(:,i) - mu) * (Y(:,i) - mu)';
C = C + WC(i) * (X(1:size(M,1),i) - M) * (Y(:,i) - mu)';
end
end