我正在尝试使用 Julia 的 @evalpoly 宏来理解。当我手动提供系数时它有效,但我一直无法弄清楚如何通过数组提供这些

julia> VERSION
v"0.3.5"

julia> @evalpoly 0.5 1 2 3 4
3.25

julia> c = [1, 2, 3, 4]
4-element Array{Int64,1}:
 1
 2
 3
 4

julia> @evalpoly 0.5 c
ERROR: BoundsError()

julia> @evalpoly 0.5 c...
ERROR: BoundsError()

julia> @evalpoly(0.5, c...)
ERROR: BoundsError()

有人可以指出我正确的方向吗?

在看到这个问题的精彩答案后添加

在我玩过其中一些答案之前,我没有看到一个微妙之处。 z@evalpoly 的参数可以是一个变量,但系数应该是文字
julia> z = 0.5
0.5

julia> @evalpoly z 1 2 3 4
3.25

julia> @evalpoly z c[1] c[2] c[3] c[4]
ERROR: c not defined

查看最后一条命令的展开的输出,可以看到确实是在展开中将 z 分配给变量的情况,但系数是按字面插入到代码中的。
julia> macroexpand(:@evalpoly z c[1] c[2] c[3] c[4])
:(if Base.Math.isa(z,Base.Math.Complex)
        #291#t = z
        #292#x = Base.Math.real(#291#t)
        #293#y = Base.Math.imag(#291#t)
        #294#r = Base.Math.+(#292#x,#292#x)
        #295#s = Base.Math.+(Base.Math.*(#292#x,#292#x),Base.Math.*(#293#y,#293#y))
        #296#a2 = c[4]
        #297#a1 = Base.Math.+(c[3],Base.Math.*(#294#r,#296#a2))
        #298#a0 = Base.Math.+(Base.Math.-(c[2],Base.Math.*(#295#s,#296#a2)),Base.Math.*(#294#r,#297#a1))
        Base.Math.+(Base.Math.*(#298#a0,#291#t),Base.Math.-(c[1],Base.Math.*(#295#s,#297#a1)))
    else
        #299#t = z
        Base.Math.+(Base.Math.c[1],Base.Math.*(#299#t,Base.Math.+(Base.Math.c[2],Base.Math.*(#299#t,Base.Math.+(Base.Math.c[3],Base.Math.*(#299#t,Base.Math.c[4]))))))
    end)

最佳答案

我不相信你想要做的事情是可能的,因为 @evalpoly 是一个宏 - 这意味着它在编译时生成代码。它生成的是霍纳方法的一个非常有效的实现(在实数情况下),但要这样做,它需要知道多项式的次数。 c 的长度在编译时是未知的,因此它不会(也不能)工作,而当您直接提供系数时,它拥有所需的一切。

不过,错误消息不是很好,所以如果可以的话,您可以在 Julia Github 页面上提交问题吗?

更新:针对问题的更新,是的,第一个参数可以是变量。你可以这样想:

function dostuff()
  z = 0.0
  # Do some stuff to z
  # Time to evaluate a polynomial!
  y = @evalpoly z 1 2 3 4
  return y
end

正在变得
function dostuff()
  z = 0.0
  # Do some stuff to z
  # Time to evaluate a polynomial!
  y = z + 2z^2 + 3z^3 + 4z^4
  return y
end

除了,不是那样,因为它使用霍纳斯规则,但无论如何。问题是,如果不知道系数的数量,它无法在 编译时间 生成该表达式。但它根本不需要知道 z 是什么。

关于带有可变参数的 Julia @evalpoly 宏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28077057/

10-12 21:48