function y = blkdiag( varargin )

% A reimplemenetation of MATLAB's blkdiag function, which is broken in
% certain versions of MATLAB. 

if nargin == 1,
    y = varargin{1};
else
    isYsparse = false;
    for k = 1 : nargin,
        x = varargin{k};
        [ p2(k+1), m2(k+1) ] = size(x);
        if issparse(x), isYsparse = true; end
    end
    p1 = cumsum(p2);
    m1 = cumsum(m2);
    if isYsparse
        y = sparse( varargin{1} );
        for k = 2 : nargin,
            y = [y sparse(p1(k),m2(k+1)); sparse(p2(k+1),m1(k)) varargin{k}];
        end
    else
        y = zeros(p1(end),m1(end));
        for k=1:nargin
            y(p1(k)+1:p1(k+1),m1(k)+1:m1(k+1)) = varargin{k};
        end
    end
end
