Polyfit函数Julia

时间:2018-06-13 08:45:13

标签: julia

我需要在julia为我最近启动的博士编写代码,并且在尝试使用polyfit软件包中的Polynomials函数时遇到此错误真的很烦我:

DomainError

Stacktrace:
 [1] polyfit(::StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}}, ::Array{Int64,1}, ::Int64, ::Symbol) at /home/jrun/.julia/v0.6/Polynomials/src/Polynomials.jl:700 (repeats 2 times)

我尝试了各种不同类型的测试,但即使使用像这样简单的代码也能继续使用它:

Pkg.add("Polynomials")
using Polynomials

x = []
for i in 1:9
  append!(x, i)
end
y = [1,2,3,4,3,4,2,3,1]
polyfit(x, y)

有人知道这意味着什么吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

请在您的问题中加入一个我们可以自我复制的独立示例。由于不同的版本/平台组合可能导致问题,因此将versioninfo()的输出值得也值得。

要回答您的问题,我将首先在我的平台中运行您的代码:

versioninfo()
Julia Version 0.6.3
Commit d55cadc350 (2018-05-28 20:20 UTC)
Platform Info:
  OS: Linux (x86_64-pc-linux-gnu)
  CPU: Intel(R) Core(TM) i7-3720QM CPU @ 2.60GHz
  WORD_SIZE: 64
  BLAS: libopenblas (NO_AFFINITY SANDYBRIDGE MAX_THREADS=8)
  LAPACK: liblapack
  LIBM: libopenlibm
  LLVM: libLLVM-3.9.1 (ORCJIT, ivybridge)

代码的输出给了我:

Pkg.add("Polynomials")
using Polynomials

x = []
for i in 1:9
  append!(x, i)
end
y = [1,2,3,4,3,4,2,3,1]
polyfit(x, y)

ERROR: `float` not defined on abstractly-typed arrays; please convert to a more specific type
Stacktrace:
 [1] float at ./float.jl:848 [inlined]
 [2] polyfit(::Array{Any,1}, ::Array{Int64,1}, ::Int64, ::Symbol) at /home/aytekin/.julia/v0.6/Polynomials/src/Polynomials.jl:708
 [3] polyfit(::Array{Any,1}, ::Array{Int64,1}) at /home/aytekin/.julia/v0.6/Polynomials/src/Polynomials.jl:700
 [4] eval(::Module, ::Any) at ./boot.jl:235

错误源于您定义x变量的方式。如果你写typeof(x),你会发现它是Array{Any,1}。在编写Any时,您正在定义类型为x = []的一维空数组。然后,您要为其附加值。定义抽象类型的容器(Any是抽象类型,其中所有julia类型都是子类型)不利于提高效率。而且,按照你的方式添加向量也不是一个好习惯。除效率问题外,x应该是某种Vector类型的Number。简而言之,如果您将代码更改为如下所示:

x = collect(1:9)
typeof(x)
y = [1,2,3,4,3,4,2,3,1]
typeof(y)
p = polyfit(x, y)

您可能会发现xy个变量都是Vector的{​​{1}}。此外,您将获得多项式。

请仔细阅读Julia Documentation的内容。如果你来自其中一种语言,那么特别有用的是Noteworthy Differences from other Languages部分。