from Sparse null space and orthogonal by Bruno Luong
NULL space and ORTHOGONAL basis for sparse matrix

sporth(S)
function [Q r] = sporth(S)
% Q = sporth(S)
% returns an (sparse) orthonormal basis for the range of S.
% That is, Q'*Q = I, the columns of Q span the same space as 
% the columns of S, and the number of columns of Q is the 
% rank of S.
%
% [~, r] = sporth(S)
% returns the rank of S
%
% If S is sparse, Q is obtained from the QR decomposition.
% Otherwise, Q is obtained from the SVD decomposition
%
% Bruno Luong <brunoluong@yahoo.com>
% History
%   10-May-2010: original version
%
% See also SPNULL, NULL, QR, SVD, ORTH, RANK

if issparse(S)
    m = size(S,1);
    try
        [Q R E] = qr(S); %#ok %full QR
        if m > 1
            s = diag(R);
        elseif m == 1
            s = R(1);
        else
            s = 0;
        end
        s = abs(s);
        tol = norm(S,'fro') * eps(class(S));
        r = sum(s > tol);
        Q = Q(:,1:r);
    catch %#ok
        % sparse QR is not available on old Matlab versions
        err = lasterror(); %#ok
        if strcmp(err.identifier, 'MATLAB:maxlhs')
            Q = orth(full(S));
        else
            rethrow(err);
        end
    end
else % Full matrix
    Q = orth(S);
end

r = size(Q,2);

end

Contact us