vamp
May 5, 2022, 1:22pm
1
Hello, I am new here and I would like to know why I can’t add these vectors:
mutable struct Mystruct
a::Int
b::SVector{3, Int64}
c::Int
end
v1=[Mystruct(1,(-2,-2,2),1)]
v2=[Mystruct(2,(2,2,2),1)]
v3 = v1 + v2
ERROR: MethodError: no method matching +(::Mystruct, ::Mystruct)
By “add” you mean, join v1
and v2
?
Either [v1; v2]
or vcat(v1, v2)
does that. This will return a fresh vector. If you want to add the elements of v2
to the existing v1
, use append!(v1, v2)
.
julia> [v1; v2]
2-element Vector{Mystruct}:
Mystruct(1, [-2, -2, 2], 1)
Mystruct(2, [2, 2, 2], 1)
1 Like
If you actually want to add instances of your type, you will have to tell Julia how addition is supposed to work for them. Something like:
julia> v1=[Mystruct(1,[1,2],1)]
1-element Vector{Mystruct}:
Mystruct(1, [1, 2], 1)
julia> v2=[Mystruct(1,[3,4],1)]
1-element Vector{Mystruct}:
Mystruct(1, [3, 4], 1)
julia> +(x::Mystruct, y::Mystruct) = Mystruct(x.a + y.a, x.b .+ y.b, x.c + y.c)
+ (generic function with 209 methods)
julia> v1+v2
1-element Vector{Mystruct}:
Mystruct(2, [4, 6], 2)
(note here I’ve simplified things by replacing the SVector
with a plain Vector
in the struct definition)
1 Like
Don’t we need first to import Base.+
, before adding the new methods?
3 Likes
vamp
May 5, 2022, 1:42pm
5
nilshg:
v2=[Mystruct(1,[3,4],1)]
With
mutable struct Mystruct
a::Int
b::Vector{ Int64}
c::Int
end
v1=[Mystruct(1,[1,2],1)]
v2=[Mystruct(1,[3,4],1)]
+(x::Mystruct, y::Mystruct) = Mystruct(x.a + y.a, x.b .+ y.b, x.c + y.c)
import Base: +
v1 + v2
ERROR: MethodError: no method matching +(::Vector{Mystruct}, ::Vector{Mystruct}) You may have intended to import Base.:+
The import
needs to come before the definition of the function for this to work.
(Test it in fresh REPL.)
vamp
May 5, 2022, 1:49pm
7
using StaticArrays
mutable struct Mystruct
a::Int
b::SVector{3, Int64}
c::Int
end
v1=[Mystruct(1,(-2,-2,2),1)]
v2=[Mystruct(2,(2,2,2),1)]
import Base: +
+(x::Mystruct, y::Mystruct) = Mystruct(x.a + y.a, x.b .+ y.b, x.c + y.c)
v3 = v1 + v2
Done, thanks!
2 Likes
Sorry I had actually done this but forgot to copy that line!
lmiq
May 5, 2022, 2:21pm
9
vamp:
v1=[Mystruct(1,(-2,-2,2),1)]
Why the braces here? This is creating a one-element vector of your structures. Is that what you want?
2 Likes