如前所述,我有一个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_predefined
是1xn
矩阵的向量,而不是向量。我在这里使用了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)