On this page
torch.linalg.qr
torch.linalg.qr(A, mode='reduced', *, out=None)-
Computes the QR decomposition of a matrix.
Letting be or , the full QR decomposition of a matrix is defined as
where is orthogonal in the real case and unitary in the complex case, and is upper triangular with real diagonal (even in the complex case).
When
m > n(tall matrix), asRis upper triangular, its lastm - nrows are zero. In this case, we can drop the lastm - ncolumns ofQto form the reduced QR decomposition:The reduced QR decomposition agrees with the full QR decomposition when
n >= m(wide matrix).Supports input of float, double, cfloat and cdouble dtypes. Also supports batches of matrices, and if
Ais a batch of matrices then the output has the same batch dimensions.The parameter
modechooses between the full and reduced QR decomposition. IfAhas shape(*, m, n), denotingk = min(m, n)mode= ‘reduced’(default): Returns(Q, R)of shapes(*, m, k),(*, k, n)respectively. It is always differentiable.mode= ‘complete’: Returns(Q, R)of shapes(*, m, m),(*, m, n)respectively. It is differentiable form <= n.mode= ‘r’: Computes only the reducedR. Returns(Q, R)withQempty andRof shape(*, k, n). It is never differentiable.
Differences with
numpy.linalg.qr:mode= ‘raw’is not implemented.- Unlike
numpy.linalg.qr, this function always returns a tuple of two tensors. Whenmode= ‘r’, theQtensor is an empty tensor.
Warning
The elements in the diagonal of
Rare not necessarily positive. As such, the returned QR decomposition is only unique up to the sign of the diagonal ofR. Therefore, different platforms, like NumPy, or inputs on different devices, may produce different valid decompositions.Warning
The QR decomposition is only well-defined if the first
k = min(m, n)columns of every matrix inAare linearly independent. If this condition is not met, no error will be thrown, but the QR produced may be incorrect and its autodiff may fail or produce incorrect results.- Parameters
- Keyword Arguments
-
out (tuple, optional) – output tuple of two tensors. Ignored if
None. Default:None. - Returns
-
A named tuple
(Q, R).
Examples:
>>> A = torch.tensor([[12., -51, 4], [6, 167, -68], [-4, 24, -41]]) >>> Q, R = torch.linalg.qr(A) >>> Q tensor([[-0.8571, 0.3943, 0.3314], [-0.4286, -0.9029, -0.0343], [ 0.2857, -0.1714, 0.9429]]) >>> R tensor([[ -14.0000, -21.0000, 14.0000], [ 0.0000, -175.0000, 70.0000], [ 0.0000, 0.0000, -35.0000]]) >>> (Q @ R).round() tensor([[ 12., -51., 4.], [ 6., 167., -68.], [ -4., 24., -41.]]) >>> (Q.T @ Q).round() tensor([[ 1., 0., 0.], [ 0., 1., -0.], [ 0., -0., 1.]]) >>> Q2, R2 = torch.linalg.qr(A, mode='r') >>> Q2 tensor([]) >>> torch.equal(R, R2) True >>> A = torch.randn(3, 4, 5) >>> Q, R = torch.linalg.qr(A, mode='complete') >>> torch.dist(Q @ R, A) tensor(1.6099e-06) >>> torch.dist(Q.mT @ Q, torch.eye(4)) tensor(6.2158e-07)
© 2024, PyTorch Contributors
PyTorch has a BSD-style license, as found in the LICENSE file.
https://pytorch.org/docs/2.1/generated/torch.linalg.qr.html