# Converting QRCompactWY.Q to Array changes its size

**URL:** <https://discourse.julialang.org/t/converting-qrcompactwy-q-to-array-changes-its-size/52291>\
**Category:** General Usage\
**Tags:** question\
**Created:** [December 23, 2020, 6:53pm UTC](https://discourse.julialang.org/t/converting-qrcompactwy-q-to-array-changes-its-size/52291 "2020-12-23T18:53:52Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![dstahlke](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dstahlke/32/20483_2.png) [@dstahlke](https://discourse.julialang.org/u/dstahlke)\
**Post date:** [December 23, 2020, 6:53pm UTC](https://discourse.julialang.org/t/converting-qrcompactwy-q-to-array-changes-its-size/52291/1 "2020-12-23T18:53:52Z")

</div>

I’m trying to convert the Q matrix from a QR transform into an Array. But it changes size. Is this a bug or am I doing it wrong?

```julia
julia> size(qr(ones(9,5)).Q)
(9, 9)

julia> size(Array(qr(ones(9,5)).Q))
(9, 5)

```

Motivation: I want an orthonormal basis for the support of a matrix, and a basis for the perpendicular space. The surrounding code looks like this:

```julia
q = qr(mat, Val(true))
take = [norm(x) >= tol for x in eachrow(q.R)]
qQ = Array(q.Q)
resize!(take, size(qQ)[2])
support = qQ[:,take]
perp = qQ[:,.!take]

```

It works if I don’t cast q.Q to an Array, but the indexing operations are then very slow.

---

<div class="post-metadata">

**Author:** ![dmbates](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dmbates/32/44_2.png) [@dmbates](https://discourse.julialang.org/u/dmbates)\
**Post date:** [December 23, 2020, 7:22pm UTC](https://discourse.julialang.org/t/converting-qrcompactwy-q-to-array-changes-its-size/52291/2 "2020-12-23T19:22:44Z")

</div>

The Q matrix is not stored explicitly in a QR decomposition. It is in a form (a set of elementary reflectors, also called Householder transformations) in which it is easy to compute Q times an array or Q’ times an array. If you really want the whole Q to create a basis, as you say, you may find that just multiplying Q by the identity is the easiest approach.

---

<div class="post-metadata">

**Author:** ![dstahlke](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dstahlke/32/20483_2.png) [@dstahlke](https://discourse.julialang.org/u/dstahlke)\
**Post date:** [December 23, 2020, 9:39pm UTC](https://discourse.julialang.org/t/converting-qrcompactwy-q-to-array-changes-its-size/52291/3 "2020-12-23T21:39:46Z")

</div>

That works, but is very slow.

```julia
julia> @time size(Array(qr(randn(200,200)).Q))
  0.022359 seconds (16 allocations: 1.636 MiB)
(200, 200)

julia> @time size(qr(randn(200,200)).Q * I)
  2.480357 seconds (120.01 k allocations: 207.935 MiB, 1.63% gc time)
(200, 200)

```

---

<div class="post-metadata">

**Author:** ![dstahlke](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dstahlke/32/20483_2.png) [@dstahlke](https://discourse.julialang.org/u/dstahlke)\
**Post date:** [December 23, 2020, 9:44pm UTC](https://discourse.julialang.org/t/converting-qrcompactwy-q-to-array-changes-its-size/52291/4 "2020-12-23T21:44:39Z")

</div>

Oh, but it’s fast if I convert `I` to an Array:

```julia
julia> @time size(qr(randn(200,200)).Q * Matrix(1.0*I, (200, 200)))
  0.004260 seconds (16 allocations: 1.636 MiB)
(200, 200)

```

It seems to me that julia could do better here by improving support for `Array(qr.Q)` and `qr.Q * I`. I think I’ll file a bug report. Thanks for the hints.

---

<div class="post-metadata">

**Author:** ![Oscar\_Smith](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/oscar_smith/32/25343_2.png) [@Oscar\_Smith](https://discourse.julialang.org/u/Oscar_Smith)\
**Post date:** [December 23, 2020, 9:57pm UTC](https://discourse.julialang.org/t/converting-qrcompactwy-q-to-array-changes-its-size/52291/5 "2020-12-23T21:57:29Z")

</div>

I think there’s currently an open PR for this.

---

<div class="post-metadata">

**Author:** ![dstahlke](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dstahlke/32/20483_2.png) [@dstahlke](https://discourse.julialang.org/u/dstahlke)\
**Post date:** [December 23, 2020, 10:52pm UTC](https://discourse.julialang.org/t/converting-qrcompactwy-q-to-array-changes-its-size/52291/6 "2020-12-23T22:52:40Z")

</div>

So there is. And posted just a few hours before my question! Thanks.

[https://github.com/JuliaLang/julia/issues/38972](https://github.com/JuliaLang/julia/issues/38972)

---

<div class="post-metadata">

**Author:** ![dmbates](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dmbates/32/44_2.png) [@dmbates](https://discourse.julialang.org/u/dmbates)\
**Post date:** [December 24, 2020, 4:21pm UTC](https://discourse.julialang.org/t/converting-qrcompactwy-q-to-array-changes-its-size/52291/7 "2020-12-24T16:21:30Z")

</div>

You may find it is better to use `lmul!(Q, Matrix(1.0*I, (200, 200)))` which performs an in-place multiplication.
