julia中是否有repmat for struct之类的功能?
Is there any function such as repmat for struct in julia?
你能帮帮我吗?我想在 Julia.In matalab 中生成一组结构,我们可以使用 repmat 作为结构。但在朱莉娅这是不可能的。 Julia 中有类似 repmat 的函数吗?
例如:
npop=20;
struct individual
position
cost
end
individual1=individual([],[])
repmat(individual1,npop,1)
repeat(individual1,npop,1)
repmat(individual1,npop,1)
ERROR: MethodError: no method matching repmat(::individual, ::Int64, ::Int64)
Closest candidates are:
repmat(::Union{AbstractArray{T,1}, AbstractArray{T,2}} where T, ::Int64, ::Int64) at abstractarray
math.jl:311
repmat(::Union{AbstractArray{T,1}, AbstractArray{T,2}} where T, ::Integer, ::Integer) at abstracta
rraymath.jl:334
repmat(::AbstractArray{T,1} where T, ::Int64) at abstractarraymath.jl:325
...
Stacktrace:
[1] macro expansion at C:\Users\admin\AppData\Local\JuliaPro-0.6.4.1\pkgs-0.6.4.1\v0.6\Atom\src\rep
l.jl:118 [inlined]
[2] anonymous at .\<missing>:?
julia>
julia> repmat(individual1,npop,1)
ERROR: MethodError: no method matching repmat(::individual, ::Int64, ::Int64)
Closest candidates are:
repmat(::Union{AbstractArray{T,1}, AbstractArray{T,2}} where T, ::Int64, ::Int64) at abstractarray
math.jl:311
repmat(::Union{AbstractArray{T,1}, AbstractArray{T,2}} where T, ::Integer, ::Integer) at abstracta
rraymath.jl:334
repmat(::AbstractArray{T,1} where T, ::Int64) at abstractarraymath.jl:325
...
Stacktrace:
[1] macro expansion at C:\Users\admin\AppData\Local\JuliaPro-0.6.4.1\pkgs-0.6.4.1\v0.6\Atom\src\rep
l.jl:118 [inlined]
[2] anonymous at .\<missing>:?
如果使用循环是可能的
pop=individual([],[])
for i=2:npop
pop=[pop;individual1]
end
和
julia> pop
20-element Array{individual,1}:
individual(Any[], Any[])
individual(Any[], Any[])
individual(Any[], Any[])
individual(Any[], Any[])
individual(Any[], Any[])
individual(Any[], Any[])
individual(Any[], Any[])
individual(Any[], Any[])
individual(Any[], Any[])
individual(Any[], Any[])
individual(Any[], Any[])
individual(Any[], Any[])
individual(Any[], Any[])
individual(Any[], Any[])
individual(Any[], Any[])
individual(Any[], Any[])
individual(Any[], Any[])
individual(Any[], Any[])
individual(Any[], Any[])
individual(Any[], Any[])
但我在 Julia 中找不到像 repmat 这样的函数。
如果我正确理解你想要实现的目标(假设你想做一种 ABM),这就是实现它的方法:
[individual([],[]) for i in 1:npop]
这样每个人都会被单独分配(这可能就是你想要的)。
作为旁注,出于性能原因,最好将类型添加到 position
和 cost
。这是一个示例,假设 position
将是包含位置的两个元素元组的向量,而 cost
是浮点数的向量:
struct individual
position::Vector{Tuple{Float64,Float64}}
cost::Vector{Float64}
end
然后你应该写:
[individual(Tuple{Float64,Float64}[],Float64[]) for i in 1:npop]
编辑
请注意,Julia 中的 struct
是不可变的。这意味着您不能重新绑定 position
和 cost
指向的值。因此你有两个选择。
选项 1. 像这样定义一个可变结构:
mutable struct individual
position
cost
end
然后您编写的代码将起作用。
选项 2 无需重新绑定的更新
在不重新绑定的情况下更新不可变结构中的向量。例如。 (使用您的原始定义)
pop = [individual([],[]) for i in 1:npop]
for i=1:npop
append!(pop[i].position, rand(0:1,10))
end
或者根据需要简单地初始化它:
pop = [individual(rand(0:1,10),[]) for i in 1:npop]
作为附加评论,请注意,在 Julia 中,您通常不需要像在 (rand(0:1,10))'
中那样使用伴随词。对向量进行操作通常就足够了。在选项 2 中(正常 struct
您将无法将二维对象附加到一维的 []
)。
你能帮帮我吗?我想在 Julia.In matalab 中生成一组结构,我们可以使用 repmat 作为结构。但在朱莉娅这是不可能的。 Julia 中有类似 repmat 的函数吗?
例如:
npop=20;
struct individual
position
cost
end
individual1=individual([],[])
repmat(individual1,npop,1)
repeat(individual1,npop,1)
repmat(individual1,npop,1)
ERROR: MethodError: no method matching repmat(::individual, ::Int64, ::Int64)
Closest candidates are:
repmat(::Union{AbstractArray{T,1}, AbstractArray{T,2}} where T, ::Int64, ::Int64) at abstractarray
math.jl:311
repmat(::Union{AbstractArray{T,1}, AbstractArray{T,2}} where T, ::Integer, ::Integer) at abstracta
rraymath.jl:334
repmat(::AbstractArray{T,1} where T, ::Int64) at abstractarraymath.jl:325
...
Stacktrace:
[1] macro expansion at C:\Users\admin\AppData\Local\JuliaPro-0.6.4.1\pkgs-0.6.4.1\v0.6\Atom\src\rep
l.jl:118 [inlined]
[2] anonymous at .\<missing>:?
julia>
julia> repmat(individual1,npop,1)
ERROR: MethodError: no method matching repmat(::individual, ::Int64, ::Int64)
Closest candidates are:
repmat(::Union{AbstractArray{T,1}, AbstractArray{T,2}} where T, ::Int64, ::Int64) at abstractarray
math.jl:311
repmat(::Union{AbstractArray{T,1}, AbstractArray{T,2}} where T, ::Integer, ::Integer) at abstracta
rraymath.jl:334
repmat(::AbstractArray{T,1} where T, ::Int64) at abstractarraymath.jl:325
...
Stacktrace:
[1] macro expansion at C:\Users\admin\AppData\Local\JuliaPro-0.6.4.1\pkgs-0.6.4.1\v0.6\Atom\src\rep
l.jl:118 [inlined]
[2] anonymous at .\<missing>:?
如果使用循环是可能的
pop=individual([],[])
for i=2:npop
pop=[pop;individual1]
end
和
julia> pop
20-element Array{individual,1}:
individual(Any[], Any[])
individual(Any[], Any[])
individual(Any[], Any[])
individual(Any[], Any[])
individual(Any[], Any[])
individual(Any[], Any[])
individual(Any[], Any[])
individual(Any[], Any[])
individual(Any[], Any[])
individual(Any[], Any[])
individual(Any[], Any[])
individual(Any[], Any[])
individual(Any[], Any[])
individual(Any[], Any[])
individual(Any[], Any[])
individual(Any[], Any[])
individual(Any[], Any[])
individual(Any[], Any[])
individual(Any[], Any[])
individual(Any[], Any[])
但我在 Julia 中找不到像 repmat 这样的函数。
如果我正确理解你想要实现的目标(假设你想做一种 ABM),这就是实现它的方法:
[individual([],[]) for i in 1:npop]
这样每个人都会被单独分配(这可能就是你想要的)。
作为旁注,出于性能原因,最好将类型添加到 position
和 cost
。这是一个示例,假设 position
将是包含位置的两个元素元组的向量,而 cost
是浮点数的向量:
struct individual
position::Vector{Tuple{Float64,Float64}}
cost::Vector{Float64}
end
然后你应该写:
[individual(Tuple{Float64,Float64}[],Float64[]) for i in 1:npop]
编辑
请注意,Julia 中的 struct
是不可变的。这意味着您不能重新绑定 position
和 cost
指向的值。因此你有两个选择。
选项 1. 像这样定义一个可变结构:
mutable struct individual
position
cost
end
然后您编写的代码将起作用。
选项 2 无需重新绑定的更新
在不重新绑定的情况下更新不可变结构中的向量。例如。 (使用您的原始定义)
pop = [individual([],[]) for i in 1:npop]
for i=1:npop
append!(pop[i].position, rand(0:1,10))
end
或者根据需要简单地初始化它:
pop = [individual(rand(0:1,10),[]) for i in 1:npop]
作为附加评论,请注意,在 Julia 中,您通常不需要像在 (rand(0:1,10))'
中那样使用伴随词。对向量进行操作通常就足够了。在选项 2 中(正常 struct
您将无法将二维对象附加到一维的 []
)。