julia - julia中是否有诸如repmat for struct之类的函数?

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

请你帮帮我好吗?我想在 Julia 中生成一个结构体群体。在 matalab 中,我们可以使用repmat 作为结构体。但在 Julia 这是不可能的。 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]

这样每个人都会被单独分配(这可能就是你想要的)。

顺便说一句,出于性能原因,最好向 positioncost 添加类型。下面是一个示例,假设 position 是包含位置的两个元素元组的向量,而 cost 是 float 向量:

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

然后你应该写:

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

编辑

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

选项 1. 将结构定义为可变结构,如下所示:

mutable struct individual
    position
    cost
end

然后您编写的代码就会起作用。

选项 2 更新而不重新绑定(bind)

更新不可变结构中的向量而不重新绑定(bind)它。例如。 (使用您原来的定义)

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 - julia中是否有诸如repmat for struct之类的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55975537/

相关文章:

visualization - 用 Julia 编程语言画图

julia - 如何在 JuMP 中指定一个只能为 0 或 1 的变量?

julia - 将本地镜像添加到 IJulia 笔记本

plot - Julia 语言微分方程示例

debugging - 调试 Julia v.0.6

julia - 如何使用 Julia 安装可移植包?

Matlab 到 Julia 优化 : Function in JuMP @SetNLObjective

multidimensional-array - Julia 中的维度不匹配

julia - 如何设置要在 IJulia 中显示的文本量

iterator - 无限期地重复 Julia 迭代器