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

use*_*331 16 julia

假设我想将向量值函数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
Run Code Online (Sandbox Code Playgroud)

现在y应该是一个矩阵,但它是4-element Array{Array{Float64,1},1}一个数组,即数组.实际上,我想y成为一个矩阵.执行phi错了吗?或者我该如何转换它?

谢谢!

Toi*_*son 13

正如你提到的,您可以连接数组的数组x使用hcat(x...),但它通常是最好创建一个矩阵来开始吧.在这种情况下,您可以采用两种方法:

  1. 使用广播:

    phi(x, d) = x.^((0:d)')
    
    Run Code Online (Sandbox Code Playgroud)

    只要x是矢量,它就会针对行矩阵进行广播(0:d)'.

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

  2. 使用二维数组理解:

    phi(x, d) = [xi.^di for xi in x, di in 0:d]
    
    Run Code Online (Sandbox Code Playgroud)

    只要x可迭代,这将起作用.如果x是一个nd数组,它将被解释为首先被展平.

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

    phi(x, d) = [xi.^di for di in 0:d, xi in x]
    
    Run Code Online (Sandbox Code Playgroud)


Dan*_*etz 12

phi输出转换为矩阵可以按如下方式完成:

   y = hcat(phi(x, 3)...)
Run Code Online (Sandbox Code Playgroud)

或者如果您希望向量为行,则需要转置:

   y = vcat([x' for x in phi(x, 3)]...)
Run Code Online (Sandbox Code Playgroud)

或者,您可以phi通过定义矩阵转换为矩阵:

   phi(x, d) = hcat([x.^i for i=0:d]...)
Run Code Online (Sandbox Code Playgroud)


小智 9

更一般地,您还可以将 splat 运算符...用于hcat

X = [[1,2], [3, 4], [5,6]]
hcat(X...)
Run Code Online (Sandbox Code Playgroud)

给出一个 2×3 矩阵

1  3  5
2  4  6
Run Code Online (Sandbox Code Playgroud)


cat*_*ure 6

splatting 之类的替代方法hcat(X...)是使用reduce

reduce(hcat, X)
Run Code Online (Sandbox Code Playgroud)

所以,在你的情况下,这可以解决问题

reduce(hcat, phi(x, 3))
Run Code Online (Sandbox Code Playgroud)