Несогласованный 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!
вызов?
1 ответ
You are using the name to refer to two different things:
- A function
- a
Vector{Float64}
, specifically
The former can be called with , the latter cannot, and will yield the error reported if you attempt to do so. One way or another, that error indicates that in the scope where you are calling
p(v)
and receiving that error, is being understood to mean (2). This could happen if you ever pasted
p = zeros(size(xx))
into the REPL, or perhaps for other reasons as well. While you may be able to avoid this by being careful with scope, the simplest solution is just not to re-use the variable name
p
in this way.