function [y,dfce]=quadclass( X, model)
% QUADCLASS Quadratic classifier.
%
% Synopsis:
% [y,dfce] = quadclass(X,model)
%
% Description:
% This function classifies input data X using quadratic
% discriminant function:
%
% y(i) = argmax X(:,i)'*A(:,:,y)*X(:,i) + X(:,i)'*B(:,y) + C(y)
% y
%
% where parameters A [dim x dim x nfun], B [dim x nfun]
% and model C [1 x nfun] are given in model and nfun is
% number of discriminant functions.
%
% In the binary case (nfun=1) the classification rule is following
% y(i) = 1 if X(:,i)'*A*X(:,i) + X(:,i)'*B + C >= 0
% 2 if X(:,i)'*A*X(:,i) + X(:,i)'*B + C < 0
%
% where A [dim x dim], B [dim x 1] and C [1x1] are parameters
% given in model.
%
% Input:
% X [dim x num_data] Data to be classified.
%
% model [struct] Describes quadratic classifier:
% .A [dim x dim x nfun] Parameter of quadratic term.
% .B [dim x nfun] Parameter of linear term.
% .C [1 x nfun] Bias.
%
% Output:
% y [1 x num_data] Predicted labels.
% dfce [nfun x num_data] Values of discriminat function.
%
% Example:
% trn = load('riply_trn');
% tst = load('riply_tst');
% gauss_model = mlcgmm(trn);
% quad_model = bayesdf(gauss_model);
% ypred = quadclass(tst.X, quad_model);
% cerror(ypred, tst.y)
% figure; ppatterns(trn); pboundary(quad_model);
%
% See also
% QMAP, LIN2QUAD, LINCLASS
%
% About: Statistical Pattern Recognition Toolbox
% (C) 1999-2003, Written by Vojtech Franc and Vaclav Hlavac
% <a href="http://www.cvut.cz">Czech Technical University Prague</a>
% <a href="http://www.feld.cvut.cz">Faculty of Electrical Engineering</a>
% <a href="http://cmp.felk.cvut.cz">Center for Machine Perception</a>
% Modifications:
% 2-may-2004, VF
model = c2s(model);
[dim, num_data] = size(X);
nfun = size(model.A,3);
if nfun == 1,
dfce = sum((model.A*X).*X,1) + model.B'*X + model.C;
y = ones(1,num_data);
y(find(dfce< 0)) = 2;
else
dfce = zeros( nfun, num_data );
for i=1:nfun,
dfce(i,:) = sum((model.A(:,:,i)*X).*X,1) + model.B(:,i)'*X + model.C(i);
end
[dummy,y] = max( dfce );
end
return;