# \`foldl\` vs \`foldr\`: matrix multiplication order

**URL:** <https://discourse.julialang.org/t/foldl-vs-foldr-matrix-multiplication-order/7367>\
**Category:** General Usage\
**Tags:** question\
**Created:** [November 28, 2017, 7:11pm UTC](https://discourse.julialang.org/t/foldl-vs-foldr-matrix-multiplication-order/7367 "2017-11-28T19:11:21Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![carstenbauer](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/carstenbauer/32/4981_2.png) [@carstenbauer](https://discourse.julialang.org/u/carstenbauer)\
**Post date:** [November 28, 2017, 7:11pm UTC](https://discourse.julialang.org/t/foldl-vs-foldr-matrix-multiplication-order/7367/1 "2017-11-28T19:11:21Z")

</div>

Sorry, but isn’t this suppose to give different results, namely `A*B` and `B*A` ???

```julia
julia> A = rand(3,3)
3x3 Array{Float64,2}:
 0.601317 0.0789842 0.624138
 0.3137 0.134492 0.600118
 0.350883 0.306819 0.930303

julia> B = rand(3,3)
3x3 Array{Float64,2}:
 0.87791 0.802677 0.691277
 0.0102793 0.369752 0.0523712
 0.628603 0.638735 0.980241

julia> foldl(*,[A,B])
3x3 Array{Float64,2}:
 0.92105 0.910527 1.03162
 0.654019 0.684845 0.812157
 0.895989 0.98931 1.17055

julia> foldr(*,[A,B])
3x3 Array{Float64,2}:
 0.92105 0.910527 1.03162
 0.654019 0.684845 0.812157
 0.895989 0.98931 1.17055

```

The examples in the [doc](https://docs.julialang.org/en/stable/stdlib/collections/#Base.foldl-Tuple%7BAny,Any%7D) work (and expectedly give different results). Please help me see my mistake, I’m apparently blind!

---

<div class="post-metadata">

**Author:** ![carstenbauer](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/carstenbauer/32/4981_2.png) [@carstenbauer](https://discourse.julialang.org/u/carstenbauer)\
**Post date:** [November 28, 2017, 7:30pm UTC](https://discourse.julialang.org/t/foldl-vs-foldr-matrix-multiplication-order/7367/2 "2017-11-28T19:30:23Z")

</div>

Ok, I just didn’t now what `foldl`/`foldr` are actually doing… I thought they fold a list from left or right but instead they seem to do (compare with example in doc):

```julia
julia> 2-(3-(4-(5)))
-2

julia> ((((2)-3)-4)-5)
-10

```

And since matrix product is associative the result ist the same.

---

<div class="post-metadata">

**Author:** ![dpsanders](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dpsanders/32/3573_2.png) [@dpsanders](https://discourse.julialang.org/u/dpsanders)\
**Post date:** [November 28, 2017, 7:30pm UTC](https://discourse.julialang.org/t/foldl-vs-foldr-matrix-multiplication-order/7367/3 "2017-11-28T19:30:40Z")

</div>

Try with three matrices. These affect the order of association, not the order from left to right.

---

<div class="post-metadata">

**Author:** ![carstenbauer](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/carstenbauer/32/4981_2.png) [@carstenbauer](https://discourse.julialang.org/u/carstenbauer)\
**Post date:** [November 28, 2017, 7:34pm UTC](https://discourse.julialang.org/t/foldl-vs-foldr-matrix-multiplication-order/7367/4 "2017-11-28T19:34:03Z")

</div>

@dpsanders thanks for your comment! However, three matrices don’t change the associativity of the matrix product.

---

<div class="post-metadata">

**Author:** ![dpsanders](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dpsanders/32/3573_2.png) [@dpsanders](https://discourse.julialang.org/u/dpsanders)\
**Post date:** [November 28, 2017, 7:38pm UTC](https://discourse.julialang.org/t/foldl-vs-foldr-matrix-multiplication-order/7367/5 "2017-11-28T19:38:49Z")

</div>

Ah, good point. Though floating point rounding errors could make a difference.

---

<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:** [November 28, 2017, 7:46pm UTC](https://discourse.julialang.org/t/foldl-vs-foldr-matrix-multiplication-order/7367/6 "2017-11-28T19:46:41Z")

</div>

> [@carstenbauer](#):
>
> Ok, I just didn’t now what foldl/foldr are actually doing… I thought they fold a list from left or right but instead they seem to do (compare with example in doc):

They _do_ fold from the left or right, traversing the list in different orders. But they do it by changing associativity, not by commuting terms. This is the [standard terminology for “fold” operations](https://en.wikipedia.org/wiki/Fold_(higher-order_function)#Folds_on_lists).
