【问题标题】:Is there any function such as repmat for struct in julia?Julia中的struct有没有诸如repmat之类的功能?
【发布时间】:2019-05-03 18:43:32
【问题描述】:

你能帮帮我吗?我想在 Julia 中生成一个结构体。在 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 这样的函数。

【问题讨论】:

  • 您在寻找repeat吗?
  • 对 struct 也有用
  • 我建议您通过添加您的输入内容和预期结果来澄清您的问题。
  • 您是否考虑过使用代表您的人口的Array{Individual,1}

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


【解决方案1】:

如果我理解你想要正确实现的目标(假设你想做一种 ABM),那么这就是实现它的方法:

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

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

作为旁注,出于性能原因,最好将类型添加到positioncost。下面是一个示例,假设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 是不可变的。这意味着您不能重新绑定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 您将无法将二维对象附加到一维的 [])。

【讨论】:

  • 。请你再帮我一次。我怎样才能初始化individualfor i=1:npop pop[i].position=(rand(0:1,10))' end 为什么会出错?谢谢
  • 我将扩展答案以涵盖此案例。
  • 如果您不介意,我可以再寻求帮助吗?我想要一个有 2 列的人口。我这样编码popc = [individual(rand(0:1,nvar),[]) for i in 1:4,j in 1:2]。有什么我不需要使用 j 的吗?非常感谢
  • 我个人喜欢这种双重索引,因为它明确说明了正在发生的事情。你也可以写例如reshape([individual(rand(0:1,nvar),[]) for i in 1:npop], :, 2)map(x -&gt; individual(rand(0:1,nvar),[]), zeros(4, 2)) 但我认为没有一个更简单。
猜你喜欢
  • 2012-11-03
  • 1970-01-01
  • 1970-01-01
  • 2011-01-22
  • 2016-06-15
  • 2013-03-06
  • 1970-01-01
  • 1970-01-01
  • 2021-05-01
相关资源
最近更新 更多