Inconsistent MethodError: only exists outside call to plots

Inconsistent MethodError: only exists outside call to plots

这是工作正常的代码:

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: objects of type Vector{Float64} are not callable Use square brackets [] for indexing an Array.

这是为什么?我可以在 plot! 调用中调用它吗?

您使用名称 p 来指代两个不同的事物:

  1. 一个函数
  2. 一个Vector{Float64},特别是p = zeros(size(xx))

前者可以用p(v)调用,后者不能,如果你试图这样做,将会产生报告的错误。不管怎样,该错误表明在您调用 p(v) 并收到该错误的范围内,p 被理解为 (2)。如果您曾经将 p = zeros(size(xx)) 粘贴到 REPL 中,或者可能出于其他原因,也可能会发生这种情况。虽然您可以通过注意范围来避免这种情况,但最简单的解决方案就是不要以这种方式重复使用变量名称 p