如何在Julia中有效地将一维数组的向量转换为二维数组(矩阵)



如前所述,我有一个1D矩阵的向量,例如:

P_predefined = [[.3 .4 .2 .1], [.2 .3 .5 0.], [.1 0. .8 .1], [.4 0. 0. .6]]

我想把它变成一个2D矩阵,我试着使用vcat,我希望它的行为像Python中的vstack,但它不起作用。

vcat(algorithm.predefinedP)

它仍然返回矢量

[[0.3 0.4 0.2 0.1], [0.2 0.3 0.5 0.0], [0.1 0.0 0.8 0.1], [0.4 0.0 0.0 0.6]] #Vector{Matrix{Float64}}

我应该如何以正确的方式做这件事?

Julia 1.9具有stack,可以通过Compat包在早期的Julia版本上使用。

julia> using Compat
julia> P_predefined = vec.([[.3 .4 .2 .1], [.2 .3 .5 0.], [.1 0. .8 .1], [.4 0. 0. .6]])
4-element Vector{Vector{Float64}}:
[0.3, 0.4, 0.2, 0.1]
[0.2, 0.3, 0.5, 0.0]
[0.1, 0.0, 0.8, 0.1]
[0.4, 0.0, 0.0, 0.6]
julia> stack(P_predefined)
4×4 Matrix{Float64}:
0.3  0.2  0.1  0.4
0.4  0.3  0.0  0.0
0.2  0.5  0.8  0.0
0.1  0.0  0.1  0.6
julia> stack(P_predefined; dims=1)
4×4 Matrix{Float64}:
0.3  0.4  0.2  0.1
0.2  0.3  0.5  0.0
0.1  0.0  0.8  0.1
0.4  0.0  0.0  0.6

注意:您的P_predefined1xn矩阵的向量,而不是向量。我在这里使用了vec将它们转换为向量。

vcat(A...)

沿维度1连接。有效地连接大型数组的矢量,使用reduce(vcat, x)

julia> reduce(vcat, P_predefined)
4×4 Matrix{Float64}:
0.3  0.4  0.2  0.1
0.2  0.3  0.5  0.0
0.1  0.0  0.8  0.1
0.4  0.0  0.0  0.6

既然提到了效率,理解能力将比vcat快两倍。

m, n = length(P_predefined), length(P_predefined[1])   
@btime mat = [$P_predefined[i][j] for i=1:$m, j=1:$n]
@btime mat = reduce(vcat, $P_predefined)
# 29.347 ns (1 allocation: 192 bytes)
# 72.131 ns (1 allocation: 192 bytes)