function [wmean,wcov]=weightmecov(data,weights)

%WEIGHTMECOV computes the reweighted mean and covariance matrix of multivariate data.
% 
% Required input arguments:
%      data : data matrix
%   weights : weights of the observations
%
% This function is part of LIBRA: the Matlab Library for Robust Analysis,
% available at: 
%              http://wis.kuleuven.be/stat/robust.html
%
%Written by Katrien Van Driessen and Carlos Lopez
%Implemented on 29 July 2005
%Last updated: 05 March 2007

n = size(data,1);
nvar = size(data,2);

if ~(isempty(find(weights<0)))
    error('The weights are negative');
end

if size(weights,1)==1
   weights=weights';
end

%Using sparse matrix; the expression is valid even for non-double data type
q=find(weights);
wmean=sum(spdiags(double(weights/sum(weights)),0,length(weights),length(weights))*double(data));
wcov=(data(q,:)-repmat(wmean,length(q),1))'*(data(q,:)-repmat(wmean,length(q),1))/(sum(weights.^2)-1);
