# Matrix Multiplication A\*B\*A'

**URL:** <https://discourse.julialang.org/t/matrix-multiplication-a-b-a/24019>\
**Category:** Performance\
**Created:** [May 9, 2019, 8:50am UTC](https://discourse.julialang.org/t/matrix-multiplication-a-b-a/24019 "2019-05-09T08:50:21Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![Marco-Congedo](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/marco-congedo/32/7321_2.png) [@Marco-Congedo](https://discourse.julialang.org/u/Marco-Congedo)\
**Post date:** [May 9, 2019, 8:50am UTC](https://discourse.julialang.org/t/matrix-multiplication-a-b-a/24019/1 "2019-05-09T08:50:21Z")

</div>

What are the efficient options to perform matrix multiplications of the form `A*B*A` and `A*B*A'` ? I am particularly intereted in the case when `A` and `B` are `Symmetric` or `Hermitian` and when these multiplications are performed repeatedly inside a loop, such as

`sum(A*B*A for B in Bset)`,

where `Bset` is an array of matrices.

Some time ago i found a post on this topic, but i am not able to retrive it anymore.

---

<div class="post-metadata">

**Author:** ![theogf](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/theogf/32/1987_2.png) [@theogf](https://discourse.julialang.org/u/theogf)\
**Post date:** [May 9, 2019, 10:12am UTC](https://discourse.julialang.org/t/matrix-multiplication-a-b-a/24019/2 "2019-05-09T10:12:29Z")

</div>

If your matrices are positive definite as well you should have a look at [https://github.com/JuliaStats/PDMats.jl](https://github.com/JuliaStats/PDMats.jl)

---

<div class="post-metadata">

**Author:** ![stevengj](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/stevengj/32/71_2.png) [@stevengj](https://discourse.julialang.org/u/stevengj)\
**Post date:** [May 9, 2019, 12:04pm UTC](https://discourse.julialang.org/t/matrix-multiplication-a-b-a/24019/3 "2019-05-09T12:04:04Z")

</div>

See also the discussion in

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

We’ve long wanted a specialized `dot(x,M,y)` function, but no one has gotten around to implementing it.

---

<div class="post-metadata">

**Author:** ![traktofon](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/traktofon/32/591_2.png) [@traktofon](https://discourse.julialang.org/u/traktofon)\
**Post date:** [May 9, 2019, 1:47pm UTC](https://discourse.julialang.org/t/matrix-multiplication-a-b-a/24019/4 "2019-05-09T13:47:19Z")

</div>

> [@Marco-Congedo](#):
>
> `sum(A*B*A for B in Bset)` ,

Wouldn’t that be the same as `A*sum(Bset)*A`? But I guess your real expression doesn’t allow such simplification…

---

<div class="post-metadata">

**Author:** ![Marco-Congedo](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/marco-congedo/32/7321_2.png) [@Marco-Congedo](https://discourse.julialang.org/u/Marco-Congedo)\
**Post date:** [May 9, 2019, 3:32pm UTC](https://discourse.julialang.org/t/matrix-multiplication-a-b-a/24019/5 "2019-05-09T15:32:18Z")

</div>

No, in fact i rather need to compute expressions such as

`sum(log(A*B*A) for B in Bset)`

---

<div class="post-metadata">

**Author:** ![Marco-Congedo](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/marco-congedo/32/7321_2.png) [@Marco-Congedo](https://discourse.julialang.org/u/Marco-Congedo)\
**Post date:** [May 9, 2019, 3:39pm UTC](https://discourse.julialang.org/t/matrix-multiplication-a-b-a/24019/6 "2019-05-09T15:39:00Z")

</div>

Unfortunately PDMats concerns real positive matrices only. I am interested in either real or complex positive matrices. As per the `A*B*A'` expression, PDmats decomposes the expression as `A*L*L'A'` using the Cholesky decomposition `B=L*L'` and uses low-level function `rmul!` in LinearAlgebra. I have tried and i don’t get a significant difference in computation time and exactly the same memory allocation.
