# Generic decomposition for A \\ x

**URL:** <https://discourse.julialang.org/t/generic-decomposition-for-a-x/27023>\
**Category:** General Usage\
**Tags:** question\
**Created:** [July 31, 2019, 9:02am UTC](https://discourse.julialang.org/t/generic-decomposition-for-a-x/27023 "2019-07-31T09:02:55Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![Tamas\_Papp](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tamas_papp/32/25949_2.png) [@Tamas\_Papp](https://discourse.julialang.org/u/Tamas_Papp)\
**Post date:** [July 31, 2019, 9:02am UTC](https://discourse.julialang.org/t/generic-decomposition-for-a-x/27023/1 "2019-07-31T09:02:55Z")

</div>

I have an algorithm where I have to perform `A * x` and `A \ x` a lot of times for the same `A::AbstractMatrix`. Importantly, `A` can be dense, triangular, sparse, etc.

I would like to save a generic decomposition object for `A` which makes this fast and numerically stable.

First I tried `lu(A)`, but that does not work for eg `LowerTriangular`. So now I am special-casing for these things. Is there a generic solution?

---

<div class="post-metadata">

**Author:** ![tim.holy](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tim.holy/32/52_2.png) [@tim.holy](https://discourse.julialang.org/u/tim.holy)\
**Post date:** [July 31, 2019, 9:35am UTC](https://discourse.julialang.org/t/generic-decomposition-for-a-x/27023/2 "2019-07-31T09:35:27Z")

</div>

Maybe add a specialization for `lu(::LowerTriangular)` in the stdlib? It’s hard to imagine a better generic solution than `lu`.

---

<div class="post-metadata">

**Author:** ![PetrKryslUCSD](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/petrkryslucsd/32/215825_2.png) [@PetrKryslUCSD](https://discourse.julialang.org/u/PetrKryslUCSD)\
**Post date:** [July 31, 2019, 9:37am UTC](https://discourse.julialang.org/t/generic-decomposition-for-a-x/27023/3 "2019-07-31T09:37:58Z")

</div>

Except maybe QR?

---

<div class="post-metadata">

**Author:** ![tim.holy](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tim.holy/32/52_2.png) [@tim.holy](https://discourse.julialang.org/u/tim.holy)\
**Post date:** [July 31, 2019, 9:38am UTC](https://discourse.julialang.org/t/generic-decomposition-for-a-x/27023/4 "2019-07-31T09:38:53Z")

</div>

For unequal sizes, sure.

---

<div class="post-metadata">

**Author:** ![Tamas\_Papp](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tamas_papp/32/25949_2.png) [@Tamas\_Papp](https://discourse.julialang.org/u/Tamas_Papp)\
**Post date:** [July 31, 2019, 9:49am UTC](https://discourse.julialang.org/t/generic-decomposition-for-a-x/27023/5 "2019-07-31T09:49:31Z")

</div>

`A` is square (sorry, forgot to say).

In fact for `A::Diagonal` or `A::AbstractTriangular`, I can just leave it alone. Would an `lu` method that does this make sense? Or complement with an `L = I`. I am not sure.

---

<div class="post-metadata">

**Author:** ![antoine-levitt](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/antoine-levitt/32/4008_2.png) [@antoine-levitt](https://discourse.julialang.org/u/antoine-levitt)\
**Post date:** [July 31, 2019, 10:00am UTC](https://discourse.julialang.org/t/generic-decomposition-for-a-x/27023/6 "2019-07-31T10:00:22Z")

</div>

Isn’t that the point of `factorize`?

---

<div class="post-metadata">

**Author:** ![Tamas\_Papp](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tamas_papp/32/25949_2.png) [@Tamas\_Papp](https://discourse.julialang.org/u/Tamas_Papp)\
**Post date:** [July 31, 2019, 10:03am UTC](https://discourse.julialang.org/t/generic-decomposition-for-a-x/27023/7 "2019-07-31T10:03:24Z")

</div>

That’s a good point, unfortunately it is not type stable. A version that would be less eager to find the best solution could work better for me.

---

<div class="post-metadata">

**Author:** ![antoine-levitt](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/antoine-levitt/32/4008_2.png) [@antoine-levitt](https://discourse.julialang.org/u/antoine-levitt)\
**Post date:** [July 31, 2019, 10:04am UTC](https://discourse.julialang.org/t/generic-decomposition-for-a-x/27023/8 "2019-07-31T10:04:18Z")

</div>

If you’re factoring a matrix I’m guessing the dynamic dispatch overhead is the least of your problems. Can’t you get by with a function barrier or a parametric type?

---

<div class="post-metadata">

**Author:** ![Tamas\_Papp](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tamas_papp/32/25949_2.png) [@Tamas\_Papp](https://discourse.julialang.org/u/Tamas_Papp)\
**Post date:** [July 31, 2019, 10:07am UTC](https://discourse.julialang.org/t/generic-decomposition-for-a-x/27023/9 "2019-07-31T10:07:05Z")

</div>

Thanks, I will benchmarks and see how it goes. This is all for CI code by the way, where I am also checking inference, but I think putting the function barrier in the right place could work around this.
