MethodError:没有方法匹配-(:: Int64,:: Array {Int64,1})

问题描述 投票:4回答:1

我尝试使用Julia文档中的this示例。我的尝试是将细胞分裂成两个部分,每个部分的蛋白质含量为一半。

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之间加一个点,但这并不能解决。我正在使用Julia 1.1.1.。

arrays julia differential-equations
1个回答
6
投票

运行代码,堆栈跟踪指向该行

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)(甚至在Julia 1.4中为only(idxs)),或者将findall替换为findfirst,它以整数(而不是数组)形式返回索引。

© www.soinside.com 2019 - 2024. All rights reserved.