function result=madc(x)

%MADC is a scale estimator given by the Median Absolute Deviation 
% with finite sample correction factor.
% It is defined as 
%           mad(x)= b_n 1.4826 med(|x_i - med(x)|)
% with b_n a small sample correction factor to make the mad unbiased at the
% normal distribution. It can resist 50% outliers. 
% If x is a matrix, the scale estimate is computed on the columns of x. The
% result is then a row vector. If x is a row or a column vector,
% the output is a scalar.
% 
% Required input argument:
%    x: either a data matrix with n observations in rows, p variables in columns
%       or a columnn vector of length n.
% 
% I/O: result=mad(x);
%
% This function is part of LIBRA: the Matlab Library for Robust Analysis,
% available at: 
%              http://wis.kuleuven.be/stat/robust.html
%
% Written by S.Verboven 
% Last revised: 22/12/03 

[n,p]=size(x);

if n==1 & p==1
    result=0;  %when X is a one by one matrix, all scale estimators must be equal to 0
    return
elseif n==1        
    x=x';   %we only want to work with column vectors
    n=p;
    p=1;
end
bn=fcorfac(x); %calculating finite sample correction
t_0=median(x);
result=median(abs(x - repmat(median(x),n,1)))*1.4826*bn; 
if ~all(result)
    result(result==0)=t_0(result==0);
end

%---------
function bn=fcorfac(Z)

[n,p]=size(Z);
switch n
case 2
   bn=1.196;
case 3
   bn=1.495;
case 4
   bn=1.363;
case 5
   bn=1.206;
case 6
   bn=1.200;
case 7
   bn=1.140;
case 8
   bn=1.129;
case 9
   bn=1.107;
end
if n>9
   bn=n/(n-0.8);
end












