Есть ли такая функция, как repmat для struct в Юлии? - PullRequest
1 голос
/ 03 мая 2019

не могли бы вы мне помочь.Я хочу создать популяцию struct в Julia. В matalab мы можем использовать repmat для структуры.но у Юлии это невозможно.есть ли какая-либо функция, например, repmat в Julia?

, например:

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[])

но я не смог найти такую ​​функцию, как repmat в Джулии.

1 Ответ

1 голос
/ 03 мая 2019

Если я понимаю, что вы хотите достичь правильно (при условии, что вы хотите сделать что-то вроде ПРО), это способ сделать это:

[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]

EDIT

Обратите внимание, что 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]

В качестве дополнительного комментария, пожалуйста, обратите внимание, что в Юлии вам, как правило, не нужно ставить присоединение, как в (rand(0:1,10))'. Работа на векторах, как правило, достаточно хороша. А в варианте 2 (обычно struct вы не сможете добавить 2-мерный объект к [], который является 1-мерным).

...