Ошибка метода: нет соответствия метода - (:: Int64, :: Array {Int64,1}) - PullRequest
4 голосов
/ 25 марта 2020

Я попытался поиграться с этим примером в документации Джулии. Моя попытка состояла в том, чтобы разделить клетку на две части, каждая из которых содержит половину количества белка.

using OrdinaryDiffEq
const α = 0.3
function f(du,u,p,t)
  for i in 1:length(u)
    du[i] = α*u[i]/length(u)
  end
end
function condition(u,t,integrator) # Event when event_f(u,t) == 0
  1-maximum(u)
end
function affect!(integrator)
  u = integrator.u
  idxs = findall(x->x>=1-eps(eltype(u)),u)
  resize!(integrator,length(u)+length(idxs))
  u[idxs] ./ 2
  u[end-idxs:end] = 0.5
  nothing
end
callback = ContinuousCallback(condition,affect!)
u0 = [0.2]
tspan = (0.0,10.0)
prob = ODEProblem(f,u0,tspan)
sol = solve(prob,Tsit5(),callback=callback)

Я получаю ошибку: MethodError: no method matching -(::Int64, ::Array{Int64,1}). Я знаю, что есть проблема с idxs = findall(x->x>=1-eps(eltype(u)),u), и я пытался поставить точку между 1 и eps, но это не помогло. Я использую Юлию 1.1.1.

1 Ответ

6 голосов
/ 25 марта 2020

При выполнении кода трассировка стека указывает на строку

u[end-idxs:end] = 0.5

Проблема здесь в том, что findall возвращает массив, даже когда он находит только один элемент, например,

julia> findall(x -> x > 2, [1,2,3])
1-element Array{Int64,1}:
 3

и вы не можете вычесть массив из end в своем индексирующем выражении.

Я недостаточно разбираюсь в вашем коде, чтобы выяснить, каким должен быть idxs, но если вы ожидаете, что это вернет только один элемент, который вы можете использовать first(idxs) (или даже only(idxs) в Julia 1.4) или заменить findall на findfirst, который возвращает индекс как целое число (а не массив).

...