【问题标题】:MethodError: no method matching -(::Int64, ::Array{Int64,1})MethodError: 没有方法匹配 -(::Int64, ::Array{Int64,1})
【发布时间】:2020-07-05 23:52:00
【问题描述】:

我尝试使用 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】:

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

    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,它将索引作为整数(而不是数组)返回。

    【讨论】:

    • 我仍然得到一个 MethodError,即:“没有方法匹配 setindex_shape_check(::Float64, ::Int64)”。 idxs 拆分任何大于或等于 1 的单元格。
    • 您的代码中很可能还有其他错误——不过您可能希望针对这些错误提出单独的问题。总的来说,我不确定我是否理解您的目标:我明白您为什么要将u 的所有元素划分在idxs 的位置,但end-idxs 应该是什么意思?当然你只能从一个位置开始索引?你的意思是end-length(idxs)吗?
    猜你喜欢
    • 2016-06-04
    • 2023-03-27
    • 1970-01-01
    • 2019-09-29
    • 2022-01-24
    • 2017-06-16
    • 1970-01-01
    • 1970-01-01
    • 2021-09-21
    相关资源
    最近更新 更多