1

这是工作正常的代码:

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!吗?

4

1 回答 1

1

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

  1. 一个函数
  2. 一个Vector{Float64},具体来说p = zeros(size(xx))

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

于 2021-07-29T04:23:51.213 回答