function output = tangentSpaceGaussianSample(base_point, manifold, sigma)        
    if strcmp(manifold.type, 'sphere')        
            m = size(base_point, 1);
%             a = normrnd(0, sigma, m-1, 1);
            a = sigma * randn(m-1, 1);
            a = [0; a];
            e1 = [1;zeros(m-1,1)];
            output = manifold.transp(e1, base_point, a);
    elseif strcmp(manifold.type, 'SPD')                
            m = size(base_point, 1);            
%             a = normrnd(0, sigma, m*(m+1)/2, 1);
            a = sigma * randn(m*(m+1)/2, 1);   
            
            A = zeros(m);                        
            indl = find(tril(ones(m)));            
            indd = find(eye(m));
            A(indl) = a;
            A = A + A';
            A(indd) = A(indd) / 2;

            c = ones(m*(m+1)/2, 1) / sqrt(2);
            C = zeros(m);
            C(indl) = c;        
            C = C + C';
            C(indd) = ones(m,1);            
            
            output = manifold.transp(eye(m), base_point, C .* A);
    elseif strcmp(manifold.type, 'HBLM')                
            m = size(base_point, 1);
%             a = normrnd(0, sigma, m-1, 1);
            a = sigma * randn(m-1,1);
            a = [0; a];
            
            e1 = [1;zeros(m-1,1)];
            output = manifold.transp(e1, base_point, a);
    elseif strcmp(manifold.type, 'Grassmann')                
            [m,r] = size(base_point);
            a = sigma * randn((m-r)*r, 1);
            A = reshape(a, m-r, r);            
            W = eye(m);
            W = W(:,1:r);
            A = [zeros(r,r); A];
            output = manifold.transp(W, base_point, A);
    else
            error('no %s manifold exists!\n',manifold.type)
    end    
end