def rq(a, overwrite_a=False, lwork=None, mode='<STR_LIT>', check_finite=True):
if mode not in ['<STR_LIT>', '<STR_LIT:r>', '<STR_LIT>']:<EOL><INDENT>raise ValueError(<EOL>"<STR_LIT>")<EOL><DEDENT>if check_finite:<EOL><INDENT>a1 = numpy.asarray_chkfinite(a)<EOL><DEDENT>else:<EOL><INDENT>a1 = numpy.asarray(a)<EOL><DEDENT>if len(a1.shape) != <NUM_LIT:2>:<EOL><INDENT>raise ValueError('<STR_LIT>')<EOL><DEDENT>M, N = a1.shape<EOL>overwrite_a = overwrite_a or (_datacopied(a1, a))<EOL>gerqf, = get_lapack_funcs(('<STR_LIT>',), (a1,))<EOL>if lwork is None or lwork == -<NUM_LIT:1>:<EOL><INDENT>rq, tau, work, info = gerqf(a1, lwork=-<NUM_LIT:1>, overwrite_a=<NUM_LIT:1>)<EOL>lwork = work[<NUM_LIT:0>].real.astype(numpy.int)<EOL><DEDENT>rq, tau, work, info = gerqf(a1, lwork=lwork, overwrite_a=overwrite_a)<EOL>if info < <NUM_LIT:0>:<EOL><INDENT>raise ValueError('<STR_LIT>'<EOL>% -info)<EOL><DEDENT>if not mode == '<STR_LIT>' or N < M:<EOL><INDENT>R = numpy.triu(rq, N-M)<EOL><DEDENT>else:<EOL><INDENT>R = numpy.triu(rq[-M:, -M:])<EOL><DEDENT>if mode == '<STR_LIT:r>':<EOL><INDENT>return R<EOL><DEDENT>gor_un_grq, = get_lapack_funcs(('<STR_LIT>',), (rq,))<EOL>if N < M:<EOL><INDENT>Q, work, info = gor_un_grq(rq[-N:], tau, lwork=-<NUM_LIT:1>, overwrite_a=<NUM_LIT:1>)<EOL>lwork = work[<NUM_LIT:0>].real.astype(numpy.int)<EOL>Q, work, info = gor_un_grq(rq[-N:], tau, lwork=lwork, overwrite_a=<NUM_LIT:1>)<EOL><DEDENT>elif mode == '<STR_LIT>':<EOL><INDENT>Q, work, info = gor_un_grq(rq, tau, lwork=-<NUM_LIT:1>, overwrite_a=<NUM_LIT:1>)<EOL>lwork = work[<NUM_LIT:0>].real.astype(numpy.int)<EOL>Q, work, info = gor_un_grq(rq, tau, lwork=lwork, overwrite_a=<NUM_LIT:1>)<EOL><DEDENT>else:<EOL><INDENT>rq1 = numpy.empty((N, N), dtype=rq.dtype)<EOL>rq1[-M:] = rq<EOL>Q, work, info = gor_un_grq(rq1, tau, lwork=-<NUM_LIT:1>, overwrite_a=<NUM_LIT:1>)<EOL>lwork = work[<NUM_LIT:0>].real.astype(numpy.int)<EOL>Q, work, info = gor_un_grq(rq1, tau, lwork=lwork, overwrite_a=<NUM_LIT:1>)<EOL><DEDENT>if info < <NUM_LIT:0>:<EOL><INDENT>raise ValueError("<STR_LIT>"<EOL>% -info)<EOL><DEDENT>return R, Q<EOL>
Compute RQ decomposition of a matrix.

Calculate the decomposition ``A = R Q`` where Q is unitary/orthogonal
and R upper triangular.

Parameters
----------
a : (M, N) array_like
    Matrix to be decomposed
overwrite_a : bool, optional
    Whether data in a is overwritten (may improve performance)
lwork : int, optional
    Work array size, lwork >= a.shape[1]. If None or -1, an optimal size
    is computed.
mode : {'full', 'r', 'economic'}, optional
    Determines what information is to be returned: either both Q and R
    ('full', default), only R ('r') or both Q and R but computed in
    economy-size ('economic', see Notes).
check_finite : bool, optional
    Whether to check that the input matrix contains only finite numbers.
    Disabling may give a performance gain, but may result in problems
    (crashes, non-termination) if the inputs do contain infinities or NaNs.

Returns
-------
R : float or complex ndarray
    Of shape (M, N) or (M, K) for ``mode='economic'``.  ``K = min(M, N)``.
Q : float or complex ndarray
    Of shape (N, N) or (K, N) for ``mode='economic'``.  Not returned
    if ``mode='r'``.

Raises
------
LinAlgError
    If decomposition fails.

Notes
-----
This is an interface to the LAPACK routines sgerqf, dgerqf, cgerqf, zgerqf,
sorgrq, dorgrq, cungrq and zungrq.

If ``mode=economic``, the shapes of Q and R are (K, N) and (M, K) instead
of (N,N) and (M,N), with ``K=min(M,N)``.

Examples
--------
>>> from scipy import linalg
>>> from numpy import random, dot, allclose
>>> a = random.randn(6, 9)
>>> r, q = linalg.rq(a)
>>> allclose(a, dot(r, q))
True
>>> r.shape, q.shape
((6, 9), (9, 9))
>>> r2 = linalg.rq(a, mode='r')
>>> allclose(r, r2)
True
>>> r3, q3 = linalg.rq(a, mode='economic')
>>> r3.shape, q3.shape
((6, 6), (6, 9))