julia中是否有诸如struct的repmat之类的功能?

时间:2019-05-03 18:43:32

标签: julia julia-jump ijulia-notebook julia-studio

请你帮我一下。我想在Julia中生成一个结构体。在matalab中,我们可以将repmat用于结构体。但是在朱莉娅,那是不可能的。朱莉娅有像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这样的函数。

1 个答案:

答案 0 :(得分:1)

如果我了解您想要正确实现的目标(假设您想进行某种ABM),这就是做到这一点的方法:

[individual([],[]) for i in 1:npop]

这样,每个人都将被单独分配(这可能是您想要的)。

请注意,出于性能原因,最好将类型添加到positioncost中。这是一个示例,假设position是包含位置的两个元素元组的向量,而cost是floats的向量:

struct individual
    position::Vector{Tuple{Float64,Float64}}
    cost::Vector{Float64}
end

然后您应该写:

[individual(Tuple{Float64,Float64}[],Float64[]) for i in 1:npop]

编辑

请注意,Julia中的struct不可变。这意味着您无法重新绑定positioncost指向的值。因此,您有两个选择。

选项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,您将无法将二维对象附加到[],即一维对象)。