arrays - MethodError: 没有方法匹配 -(::Int64, ::Array{Int64,1})
问题描述
我尝试在 Julia 文档中使用这个示例。我的尝试是将细胞分成两部分,每部分的蛋白质含量是一半。
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。
解决方案
运行您的代码堆栈跟踪指向该行
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
,它将索引作为整数返回(而不是一个数组)。
推荐阅读
- database - Mongo 从大型查询中获取唯一字段值
- oracle - 如何使用 Oracle 存储过程在 SSRS 中创建数据集
- reactjs - VScode没有拿起eslint.rc,但终端是
- dart - Flutter bloc 和 Firebase 电话身份验证
- java - Android Intent.FLAG_ACTIVITY_CLEAR_TOP 清除 SharedPreferences?
- mongodb - 在 $addFields mongo 聚合中添加一个字段,该字段是另一个字段的映射
- scala - 比较两个数据帧得到数字重复
- f# - F#管道函数执行流程
- elasticsearch - Elasticsearch:可以用来避免编写自己的 NLP 吗?(例如重新发明轮子)
- c - 将图像转换为原始位图文件