# Hcat with matrices as elements

**URL:** <https://discourse.julialang.org/t/hcat-with-matrices-as-elements/59817>\
**Category:** General Usage\
**Tags:** matrices\
**Created:** [April 22, 2021, 4:50pm UTC](https://discourse.julialang.org/t/hcat-with-matrices-as-elements/59817 "2021-04-22T16:50:37Z")\
**Posts on this page:** 18\
**Page:** 1

<div class="post-metadata">

**Author:** ![FeldrinH](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/feldrinh/32/24286_2.png) [@FeldrinH](https://discourse.julialang.org/u/FeldrinH)\
**Post date:** [April 22, 2021, 4:50pm UTC](https://discourse.julialang.org/t/hcat-with-matrices-as-elements/59817/1 "2021-04-22T16:50:37Z")

</div>

If I want a matrix with a single row of numbers I can do [1 2 3 4 5] or the equivalen function call hcat(1, 2, 3, 4, 5). However, what if I want a matrix with a single row of matrices as elements? If a,b, c, d and e are matrices, then doing [a b c d e] just concatenates them into one single big matrix, instead of giving a 1x5 matrix with the matrices a, b, c, d and e as elements.

What would be the recommended way to create such a matrix of matrices? Is there a short, fast and convenient way?

---

<div class="post-metadata">

**Author:** ![DNF](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dnf/32/10191_2.png) [@DNF](https://discourse.julialang.org/u/DNF)\
**Post date:** [April 22, 2021, 5:03pm UTC](https://discourse.julialang.org/t/hcat-with-matrices-as-elements/59817/2 "2021-04-22T17:03:08Z")

</div>

Curious: why not a vector of matrices?

If you start with a vector you can `reshape` it into a matrix, BTW.

---

<div class="post-metadata">

**Author:** ![FeldrinH](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/feldrinh/32/24286_2.png) [@FeldrinH](https://discourse.julialang.org/u/FeldrinH)\
**Post date:** [April 22, 2021, 5:09pm UTC](https://discourse.julialang.org/t/hcat-with-matrices-as-elements/59817/3 "2021-04-22T17:09:17Z")

</div>

A vector seems to be interpreted by most functions as equivalent to a matrix with a single column, but I need a matrix with a single row. (For example vcat will concatenate vectors into a single long vector, whereas it will concatenate matrices with a single row and multiple columns into a matrix with multiple rows and multiple columns)

---

<div class="post-metadata">

**Author:** ![FeldrinH](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/feldrinh/32/24286_2.png) [@FeldrinH](https://discourse.julialang.org/u/FeldrinH)\
**Post date:** [April 22, 2021, 5:10pm UTC](https://discourse.julialang.org/t/hcat-with-matrices-as-elements/59817/4 "2021-04-22T17:10:23Z")

</div>

Creating a vector and reshaping does work, but it adds a layer of indirection. I was curious if there is a way to create such a single row matrix directly.

---

<div class="post-metadata">

**Author:** ![feanor12](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/feanor12/32/8212_2.png) [@feanor12](https://discourse.julialang.org/u/feanor12)\
**Post date:** [April 22, 2021, 5:33pm UTC](https://discourse.julialang.org/t/hcat-with-matrices-as-elements/59817/5 "2021-04-22T17:33:56Z")

</div>

Maybe something like this?

```julia
getfield.(hcat(Ref(rand(2,2)),Ref(rand(3,3))),:x)

```

---

<div class="post-metadata">

**Author:** ![rafael.guerra](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rafael.guerra/32/216610_2.png) [@rafael.guerra](https://discourse.julialang.org/u/rafael.guerra)\
**Post date:** [April 22, 2021, 5:34pm UTC](https://discourse.julialang.org/t/hcat-with-matrices-as-elements/59817/6 "2021-04-22T17:34:07Z")

</div>

`[a, b, c, d, e][:,:]`

---

<div class="post-metadata">

**Author:** ![DNF](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dnf/32/10191_2.png) [@DNF](https://discourse.julialang.org/u/DNF)\
**Post date:** [April 22, 2021, 5:36pm UTC](https://discourse.julialang.org/t/hcat-with-matrices-as-elements/59817/7 "2021-04-22T17:36:34Z")

</div>

> [@rafael.guerra](#):
>
> `[a, b, c, d, e][:,:]`

But this is basically the same as `reshape`, just slower.

And, doesn’t it make a 5x1 matrix instead of a 1x5?

---

<div class="post-metadata">

**Author:** ![rafael.guerra](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rafael.guerra/32/216610_2.png) [@rafael.guerra](https://discourse.julialang.org/u/rafael.guerra)\
**Post date:** [April 22, 2021, 5:39pm UTC](https://discourse.julialang.org/t/hcat-with-matrices-as-elements/59817/8 "2021-04-22T17:39:39Z")

</div>

Speed is not the only criterion in life. 😉

---

<div class="post-metadata">

**Author:** ![DNF](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dnf/32/10191_2.png) [@DNF](https://discourse.julialang.org/u/DNF)\
**Post date:** [April 22, 2021, 5:44pm UTC](https://discourse.julialang.org/t/hcat-with-matrices-as-elements/59817/9 "2021-04-22T17:44:46Z")

</div>

As if😄

---

<div class="post-metadata">

**Author:** ![rafael.guerra](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rafael.guerra/32/216610_2.png) [@rafael.guerra](https://discourse.julialang.org/u/rafael.guerra)\
**Post date:** [April 22, 2021, 6:02pm UTC](https://discourse.julialang.org/t/hcat-with-matrices-as-elements/59817/10 "2021-04-22T18:02:10Z")

</div>

Direct:

```julia
[[a] [b] [c] [d] [e]]

```

---

<div class="post-metadata">

**Author:** ![DNF](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dnf/32/10191_2.png) [@DNF](https://discourse.julialang.org/u/DNF)\
**Post date:** [April 22, 2021, 8:25pm UTC](https://discourse.julialang.org/t/hcat-with-matrices-as-elements/59817/11 "2021-04-22T20:25:14Z")

</div>

Faster:

```julia
permutedims([a, b, c, d, e])

```

---

<div class="post-metadata">

**Author:** ![feanor12](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/feanor12/32/8212_2.png) [@feanor12](https://discourse.julialang.org/u/feanor12)\
**Post date:** [April 22, 2021, 8:47pm UTC](https://discourse.julialang.org/t/hcat-with-matrices-as-elements/59817/12 "2021-04-22T20:47:57Z")

</div>

Update: I added some asserts.

```julia
module A
using BenchmarkTools

const a = rand(3,3)
const b = rand(3,3)
const c = rand(3,3)
const d = rand(3,3)
const e = rand(3,3)

@btime [a,b,c,d,e]
# fails
# @assert size([a,b,c,d,e]) == (1,5)
# fails
# @assert [a,b,c,d,e] isa Matrix{Matrix{Float64}}

@btime [a,b,c,d,e][:,:]
# fails
# @assert size([a,b,c,d,e][:,:]) == (1,5)
@assert [a,b,c,d,e][:,:] isa Matrix{Matrix{Float64}}

@btime transpose([a,b,c,d,e][:,:])
@assert size(transpose([a,b,c,d,e][:,:])) == (1,5)
# fails
# @assert transpose([a,b,c,d,e][:,:]) isa Matrix{Matrix{Float64}}
  
@btime permutedims([a,b,c,d,e][:,:])                                                                                                          
@assert size(permutedims([a,b,c,d,e][:,:])) == (1,5)                                                                                          
@assert permutedims([a,b,c,d,e][:,:]) isa Matrix{Matrix{Float64}}     

@btime permutedims([a,b,c,d,e])
@assert size(permutedims([a,b,c,d,e])) == (1,5)
@assert permutedims([a,b,c,d,e]) isa Matrix{Matrix{Float64}}

@btime getfield.(hcat(Ref(a),Ref(b),Ref(c),Ref(d),Ref(e)),:x)
@assert size(getfield.(hcat(Ref(a),Ref(b),Ref(c),Ref(d),Ref(e)),:x)) == (1,5)
@assert getfield.(hcat(Ref(a),Ref(b),Ref(c),Ref(d),Ref(e)),:x) isa Matrix{Matrix{Float64}}

function mcat(args::Matrix{T}...) where T
    l = length(args)
    r = Matrix{Matrix{T}}(undef,1,l)
    for (i,arg) in enumerate(args)
        @inbounds r[1,i] = arg
    end
    r
end

@btime mcat(a,b,c,d,e)
@assert size(mcat(a,b,c,d,e)) == (1,5)
@assert mcat(a,b,c,d,e) isa Matrix{Matrix{Float64}}

end

```

```julia
julia> include("test.jl")
  54.884 ns (1 allocation: 128 bytes)
  140.585 ns (2 allocations: 256 bytes)
  141.619 ns (2 allocations: 256 bytes)
  233.428 ns (3 allocations: 384 bytes)
  134.188 ns (3 allocations: 224 bytes)
  329.203 ns (7 allocations: 336 bytes)
  63.907 ns (1 allocation: 128 bytes)
Main.A

```

---

<div class="post-metadata">

**Author:** ![DNF](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dnf/32/10191_2.png) [@DNF](https://discourse.julialang.org/u/DNF)\
**Post date:** [April 22, 2021, 8:53pm UTC](https://discourse.julialang.org/t/hcat-with-matrices-as-elements/59817/13 "2021-04-22T20:53:14Z")

</div>

> [@feanor12](#):
>
> `@btime [a,b,c,d,e][:,:]`

This doesn’t actually do the correct thing.

---

<div class="post-metadata">

**Author:** ![feanor12](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/feanor12/32/8212_2.png) [@feanor12](https://discourse.julialang.org/u/feanor12)\
**Post date:** [April 22, 2021, 9:07pm UTC](https://discourse.julialang.org/t/hcat-with-matrices-as-elements/59817/14 "2021-04-22T21:07:22Z")

</div>

That is correct, but I included it just in case one would be ok with the switched dimensions.

---

<div class="post-metadata">

**Author:** ![rafael.guerra](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rafael.guerra/32/216610_2.png) [@rafael.guerra](https://discourse.julialang.org/u/rafael.guerra)\
**Post date:** [April 22, 2021, 9:08pm UTC](https://discourse.julialang.org/t/hcat-with-matrices-as-elements/59817/15 "2021-04-22T21:08:03Z")

</div>

Should use: `transpose([a,b,c,d,e][:,:])`

---

<div class="post-metadata">

**Author:** ![feanor12](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/feanor12/32/8212_2.png) [@feanor12](https://discourse.julialang.org/u/feanor12)\
**Post date:** [April 22, 2021, 9:11pm UTC](https://discourse.julialang.org/t/hcat-with-matrices-as-elements/59817/16 "2021-04-22T21:11:02Z")

</div>

`transpose` does not work on Matrix{String}, but `permutedims` does.

---

<div class="post-metadata">

**Author:** ![DNF](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dnf/32/10191_2.png) [@DNF](https://discourse.julialang.org/u/DNF)\
**Post date:** [April 22, 2021, 9:24pm UTC](https://discourse.julialang.org/t/hcat-with-matrices-as-elements/59817/17 "2021-04-22T21:24:11Z")

</div>

> [@rafael.guerra](#):
>
> transpose([a,b,c,d,e][:,:])

`transpose` also transposes all the sub-elements, recursively, and I don’t think that is wanted here.

---

<div class="post-metadata">

**Author:** ![rafael.guerra](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rafael.guerra/32/216610_2.png) [@rafael.guerra](https://discourse.julialang.org/u/rafael.guerra)\
**Post date:** [April 22, 2021, 9:26pm UTC](https://discourse.julialang.org/t/hcat-with-matrices-as-elements/59817/18 "2021-04-22T21:26:16Z")

</div>

@DNF, thanks - reverting back.
