# How to define structure with its field is matrix?

**URL:** <https://discourse.julialang.org/t/how-to-define-structure-with-its-field-is-matrix/67450>\
**Category:** General Usage\
**Tags:** question\
**Created:** [August 31, 2021, 8:04pm UTC](https://discourse.julialang.org/t/how-to-define-structure-with-its-field-is-matrix/67450 "2021-08-31T20:04:21Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![Amro](https://avatars.discourse-cdn.com/v4/letter/a/4491bb/32.png) [@Amro](https://discourse.julialang.org/u/Amro)\
**Post date:** [August 31, 2021, 8:04pm UTC](https://discourse.julialang.org/t/how-to-define-structure-with-its-field-is-matrix/67450/1 "2021-08-31T20:04:21Z")

</div>

I have a structure as below:

```julia
struct R
    value::Vector{Float64} = []
end

```

however, I want to make the “value” to be matrix (undefined,3) with elements type as “Float64” so I adjusted as below:

```julia
struct R
    value::Array{Vector{Float64}, 3} = []
end

```

So later, I can push value such as

```julia
push!(R.value, [5;6;7])

```

but it didnt work, any idea?

---

<div class="post-metadata">

**Author:** ![jling](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jling/32/212909_2.png) [@jling](https://discourse.julialang.org/u/jling)\
**Post date:** [August 31, 2021, 8:06pm UTC](https://discourse.julialang.org/t/how-to-define-structure-with-its-field-is-matrix/67450/2 "2021-08-31T20:06:32Z")

</div>

> [@Amro](#):
>
> `[]`

this is not an `Array{Vector{Float64}, 3}`, this is a `Vector{Any}`, which is just an alias for `Array{Any, 1}`. So the important thing is that this has dimension equals 1, instead of 3.

---

<div class="post-metadata">

**Author:** ![tomerarnon](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tomerarnon/32/3170_2.png) [@tomerarnon](https://discourse.julialang.org/u/tomerarnon)\
**Post date:** [August 31, 2021, 9:33pm UTC](https://discourse.julialang.org/t/how-to-define-structure-with-its-field-is-matrix/67450/3 "2021-08-31T21:33:42Z")

</div>

Also, you can’t push to a 3-dimensional array, only a 1-dimensional one. You could use a vector of vectors (`Vector{Vector{Float64}}`) and push to it just fine. If all of your entries are length 3, you might also want to look into `StaticArrays.jl`.  
If you specifically want a `Matrix` (which is an alias for `Array{T, 2}`), and you also need it to be resize-able, you could try `ElasticArrays.jl`.

---

<div class="post-metadata">

**Author:** ![Amro](https://avatars.discourse-cdn.com/v4/letter/a/4491bb/32.png) [@Amro](https://discourse.julialang.org/u/Amro)\
**Post date:** [August 31, 2021, 9:53pm UTC](https://discourse.julialang.org/t/how-to-define-structure-with-its-field-is-matrix/67450/4 "2021-08-31T21:53:32Z")

</div>

> [@Amro](#):
>
> `value`

I used as suggested but I got error.

```julia
julia> Base.@kwdef mutable struct R
           value::Vector{Vector{Float64}} = []
       end
R

julia> push!(R.value, [5;6;7])
ERROR: type DataType has no field value
Stacktrace:
 [1] getproperty(x::Type, f::Symbol)
   @ Base .\Base.jl:28
 [2] top-level scope
   @ REPL[1]:1

```

---

<div class="post-metadata">

**Author:** ![tomerarnon](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tomerarnon/32/3170_2.png) [@tomerarnon](https://discourse.julialang.org/u/tomerarnon)\
**Post date:** [August 31, 2021, 9:57pm UTC](https://discourse.julialang.org/t/how-to-define-structure-with-its-field-is-matrix/67450/5 "2021-08-31T21:57:38Z")

</div>

`R` is the name of the struct, not an instance of it. It’s like saying `x = Int + 1` (that doesn’t make sense).  
try

```julia
r = R()
push!(r, [1,2,3])

```

---

<div class="post-metadata">

**Author:** ![Amro](https://avatars.discourse-cdn.com/v4/letter/a/4491bb/32.png) [@Amro](https://discourse.julialang.org/u/Amro)\
**Post date:** [August 31, 2021, 10:01pm UTC](https://discourse.julialang.org/t/how-to-define-structure-with-its-field-is-matrix/67450/6 "2021-08-31T22:01:16Z")

</div>

Yes, I missed creating an instance first.  
Thank you very much!

---

<div class="post-metadata">

**Author:** ![Seif\_Shebl](https://avatars.discourse-cdn.com/v4/letter/s/eada6e/32.png) [@Seif\_Shebl](https://discourse.julialang.org/u/Seif_Shebl)\
**Post date:** [August 31, 2021, 10:11pm UTC](https://discourse.julialang.org/t/how-to-define-structure-with-its-field-is-matrix/67450/7 "2021-08-31T22:11:06Z")

</div>

You may want to do this:

```julia
struct R
    value::Vector{Vector{Float64}}
end

R() = R(Vector{Vector{Float64}}(undef,0))

x = R()
push!(x.value, [5;6;7])

```

---

<div class="post-metadata">

**Author:** ![Amro](https://avatars.discourse-cdn.com/v4/letter/a/4491bb/32.png) [@Amro](https://discourse.julialang.org/u/Amro)\
**Post date:** [August 31, 2021, 10:12pm UTC](https://discourse.julialang.org/t/how-to-define-structure-with-its-field-is-matrix/67450/8 "2021-08-31T22:12:02Z")

</div>

The below is growing vertically, although the input data are ([9;9;9] and [1;1;1])is as seen below:

```julia
julia> Base.@kwdef mutable struct R
                         value::Vector{Vector{Float64}} = []
                     end
R

julia> r = R()
R(Vector{Float64}[])

julia> push!(r.value, [9;9;9])
1-element Vector{Vector{Float64}}:
 [9.0, 9.0, 9.0]

julia> push!(r.value, [1;1;1])
2-element Vector{Vector{Float64}}:
 [9.0, 9.0, 9.0]
 [1.0, 1.0, 1.0]

```

Is there any way to make it grow horizontally, i.e., similar to below:

```julia
 [9.0 1.0]
 [9.0 1.0]
 [9.0 1.0]

```

---

<div class="post-metadata">

**Author:** ![tomerarnon](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tomerarnon/32/3170_2.png) [@tomerarnon](https://discourse.julialang.org/u/tomerarnon)\
**Post date:** [August 31, 2021, 11:09pm UTC](https://discourse.julialang.org/t/how-to-define-structure-with-its-field-is-matrix/67450/9 "2021-08-31T23:09:08Z")

</div>

No. Not with a vector-of-vectors anyway. See if ElasticArrays is what you want.
