# Concatening matrix in a loop

**URL:** <https://discourse.julialang.org/t/concatening-matrix-in-a-loop/26347>\
**Category:** General Usage\
**Created:** [July 14, 2019, 3:47pm UTC](https://discourse.julialang.org/t/concatening-matrix-in-a-loop/26347 "2019-07-14T15:47:09Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![angeloaliano1](https://avatars.discourse-cdn.com/v4/letter/a/7ea924/32.png) [@angeloaliano1](https://discourse.julialang.org/u/angeloaliano1)\
**Post date:** [July 14, 2019, 3:47pm UTC](https://discourse.julialang.org/t/concatening-matrix-in-a-loop/26347/1 "2019-07-14T15:47:09Z")

</div>

Dear users,  
I need to build a matrix using a loop, like this:

```julia
X = zeros(3,1)
for i=1:10 
     x = rand(3,1)
     X = [X x]
end

```

i.e., I need to build the columns of X using a looping. What’s the better way to do its?

---

<div class="post-metadata">

**Author:** ![Paul\_Soderlind](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/paul_soderlind/32/1753_2.png) [@Paul\_Soderlind](https://discourse.julialang.org/u/Paul_Soderlind)\
**Post date:** [July 14, 2019, 4:15pm UTC](https://discourse.julialang.org/t/concatening-matrix-in-a-loop/26347/2 "2019-07-14T16:15:39Z")

</div>

To be more efficient, preallocate `X` and then fill it. Something like this

```julia
X = zeros(3,10)
for i = 1:10
    X[:,i] = rand(3)
end

```

(In this particular case, you could do `X=rand(3,10)`.)

---

<div class="post-metadata">

**Author:** ![kristoffer.carlsson](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kristoffer.carlsson/32/22_2.png) [@kristoffer.carlsson](https://discourse.julialang.org/u/kristoffer.carlsson)\
**Post date:** [July 14, 2019, 4:32pm UTC](https://discourse.julialang.org/t/concatening-matrix-in-a-loop/26347/4 "2019-07-14T16:32:02Z")

</div>

```julia
reduce(hcat, (rand(3) for i in 1:10); init=X)

```

---

<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 14, 2019, 4:55pm UTC](https://discourse.julialang.org/t/concatening-matrix-in-a-loop/26347/5 "2019-07-14T16:55:59Z")

</div>

Also, please don’t post the [same thing](https://discourse.julialang.org/t/concatening-matrix-in-a-loop/26347) multiple times.

---

<div class="post-metadata">

**Author:** ![braamvandyk](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/braamvandyk/32/5086_2.png) [@braamvandyk](https://discourse.julialang.org/u/braamvandyk)\
**Post date:** [July 14, 2019, 6:54pm UTC](https://discourse.julialang.org/t/concatening-matrix-in-a-loop/26347/7 "2019-07-14T18:54:32Z")

</div>

Because I just couldn’t resist, and as this is something I can see myself using often enough:

```julia
function func1(;n=10, m=3)
    X = zeros(m,1)
    for i=1:n 
        x = rand(m,1)
        X = [X x]
    end
    return X
end

function func2(;n=10, m=3)
    X = zeros(m,n)
    for i = 1:n
        X[:,i] = rand(m)
    end
    return X
end

function func3(;n=10, m=3)
    X = zeros(m,n)
    reduce(hcat, (rand(m) for i in 1:n); init=X)  
    return X
end

julia> @btime func1(n=10, m=3)
  878.317 ns (31 allocations: 3.89 KiB)

julia> @btime func2(n=10, m=3)
  502.572 ns (11 allocations: 1.42 KiB)

julia> @btime func3(n=10, m=3)
  1.210 μs (32 allocations: 6.33 KiB)

julia> @btime func1(n=100, m=3)
  20.901 μs (301 allocations: 148.00 KiB)

julia> @btime func2(n=100, m=3)
  4.586 μs (101 allocations: 13.44 KiB)

julia> @btime func3(n=100, m=3)
  48.901 μs (302 allocations: 384.52 KiB)

julia> @btime func1(n=10, m=30)
  2.589 μs (31 allocations: 20.52 KiB)

julia> @btime func2(n=10, m=30)
  1.080 μs (11 allocations: 5.78 KiB)

julia> @btime func3(n=10, m=30)
  5.433 μs (32 allocations: 43.92 KiB)

```

Potential shortcomings in my benchmarking aside, I was not expecting the large differences, especially with the 100 x 3 case.

---

<div class="post-metadata">

**Author:** ![mcabbott](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mcabbott/32/6603_2.png) [@mcabbott](https://discourse.julialang.org/u/mcabbott)\
**Post date:** [July 14, 2019, 7:54pm UTC](https://discourse.julialang.org/t/concatening-matrix-in-a-loop/26347/8 "2019-07-14T19:54:08Z")

</div>

Note that these 3 functions don’t have quite the same output. And also that `collect`ing the generator makes a big difference:

```julia
julia> func4(;n, m) = reduce(hcat, rand(m) for i in 1:n);

julia> @btime func4(n=100, m=3);
  19.821 μs (301 allocations: 145.44 KiB)

julia> func5(;n, m) = reduce(hcat, [rand(m) for i in 1:n]);

julia> @btime func5(n=100, m=3);
  6.063 μs (102 allocations: 14.31 KiB)

```
