Julia 如何将数组的数组转换为矩阵?

Julia 如何将数组的数组转换为矩阵?,julia,Julia,假设我想将向量值函数φ应用于向量x: phi(x, d) = [x.^i for i=0:d] # vector-valued function x = rand(7) # vector y = phi(x, 3) # should be matrix, but isn't 现在y应该是一个矩阵,但它是一个4元素数组{Array{Float64,1},1},即数组的数组。实际上,我希望y是一个矩阵。phi的实现是

假设我想将向量值函数φ应用于向量x:

phi(x, d) = [x.^i for i=0:d]    # vector-valued function
x = rand(7)                     # vector
y = phi(x, 3)                   # should be matrix, but isn't
现在
y
应该是一个矩阵,但它是一个
4元素数组{Array{Float64,1},1}
,即数组的数组。实际上,我希望
y
是一个矩阵。
phi
的实现是否错误?或者我如何转换它


谢谢

将phi的输出转换为矩阵的过程如下所示:

   y = hcat(phi(x, 3)...)
或者,如果您希望向量是行,则需要转置:

   y = vcat([x' for x in phi(x, 3)]...)
或者,您可以通过定义以下内容将其转换为
phi
中的矩阵:

   phi(x, d) = hcat([x.^i for i=0:d]...)

正如您所指出的,您可以使用
hcat(x…
)来连接数组
x
,但通常最好先创建一个矩阵。在这种情况下,有两种方法可以做到:

  • 使用广播:

    phi(x, d) = x.^((0:d)')
    
    只要
    x
    是一个向量,它就会针对行矩阵
    (0:d)
    进行广播

    您可以通过转置
    x
    而不是范围
    0:d
    来获得转置结果

  • 使用二维数组理解:

    phi(x, d) = [xi.^di for xi in x, di in 0:d]
    
    只要
    x
    是可编辑的,这将起作用。如果
    x
    是一个n-d数组,则会将其解释为先将其展平

    您可以通过切换理解变量的顺序来转换结果:

    phi(x, d) = [xi.^di for di in 0:d, xi in x]
    

  • 一般来说,您还可以将splat运算符
    hcat
    一起使用:

    X = [[1,2], [3, 4], [5,6]]
    hcat(X...)
    
    给出了一个2乘3的矩阵

    1  3  5
    2  4  6
    

    类似于
    hcat(X…)
    的飞溅的替代方法是使用
    reduce

    reduce(hcat, X)
    
    因此,在您的情况下,这将起到作用

    reduce(hcat, phi(x, 3))