arrays - 不一致的 MethodError:仅存在于对绘图的调用之外
问题描述
这是工作正常的代码:
function band_limited_interpolation()
h=1
xmax=10
x = -xmax:h:xmax
xx = -xmax-h/20:h/10:xmax+h/20
v = x .== 0
function p(v)
p = zeros(size(xx))
for i in 1:length(x)
p += v[i] * sin.(π*(xx.-x[i])/h) ./ (π*(xx.-x[i])/h)
end
p
end
plot1 = plot(x, v, seriestype=:scatter, legend=false)
plot!(xx, p(v), xlims=(-10,10), ylims=(-0.5,1.1))
end
band_limited_interpolation()
但是,如果我再次尝试调用,则会p(v)
收到方法错误。
这是相同的函数,只有最后一行发生了变化:
function band_limited_interpolation()
h=1
xmax=10
x = -xmax:h:xmax
xx = -xmax-h/20:h/10:xmax+h/20
v = x .== 0
function p(v)
p = zeros(size(xx))
for i in 1:length(x)
p += v[i] * sin.(π*(xx.-x[i])/h) ./ (π*(xx.-x[i])/h)
end
p
end
plot1 = plot(x, v, seriestype=:scatter, legend=false)
plot!(xx, p(v), xlims=(-10,10), ylims=(-0.5,1.1))
p(v)
end
band_limited_interpolation()
MethodError: Vector{Float64} 类型的对象不可调用使用方括号 [] 来索引数组。
为什么是这样?我可以在通话中调用它plot!
吗?
解决方案
您正在使用该名称p
来指代两个不同的事物:
- 一个函数
- 一个
Vector{Float64}
,具体来说p = zeros(size(xx))
前者可以用 调用p(v)
,后者不能,如果您尝试这样做,将产生报告的错误。一种或另一种方式,该错误表明在您调用p(v)
和接收该错误的范围内,p
被理解为意味着(2)。如果您曾经粘贴p = zeros(size(xx))
到 REPL 中,或者可能出于其他原因,可能会发生这种情况。虽然您可以通过注意范围来避免这种情况,但最简单的解决方案就是不要以p
这种方式重用变量名。
推荐阅读
- swiftui - 从 SwiftUI 中的图像选择器中选择图片后,无法单击“完成”按钮
- python - Python Pandas 中 DataFrame 的聚合?
- java - 无法运行@Advice catch 异常块
- python-3.x - Discord 如何在没有新授权的情况下获得无限的 Spotify 代币?
- direct2d - ID2D1DeviceContext::CreateBitmap 的哪个参数有误?
- composer-php - Composer php 错误 - 应为以下之一:'STRING'、'NUMBER'、'NULL'、'TRUE'、'FALSE'、'{'、'['
- algorithm - 内循环为 j < i 的嵌套循环的时间复杂度是多少?
- python - Itertools 排列组合与固定放置
- python-3.x - Pyspark在用0替换null时出错
- javascript - 多个输入内的多个输入表单