我找不到这个简单问题的答案。
我有以下内容:
A(a,j)=[a*j*i*k for i in 1:2, k in 1:2];
B=[A(a,j) for a in 1:2, j in 1:2];
B
是一个数组数组:2×2 Array{Array{Int64,2},2}
。这对于轻松访问带有索引的子数组很有用(例如B[2,1]
)。但是,我还需要将B
转换为4 x 4矩阵。我尝试了hcat(B...)
,但是会产生2 x 8的矩阵,而其他选项则更糟(例如cat(Test2...;dims=(2,1))
)。
是否有一种有效的方式将B
编写为矩阵,同时保持轻松访问其子数组的能力,特别是当B
变得很大时?
答案 0 :(得分:5)
您想要这个吗?
julia> hvcat(size(B,1), B...)
4×4 Array{Int64,2}:
1 2 2 4
2 4 4 8
2 4 4 8
4 8 8 16
或未定义B
:
julia> hvcat(2, (A(a,j) for a in 1:2, j in 1:2)...)
4×4 Array{Int64,2}:
1 2 2 4
2 4 4 8
2 4 4 8
4 8 8 16
答案 1 :(得分:3)
那
B = reduce(hcat, reduce(vcat, A(a,j) for a in 1:2) for j in 1:2)
编辑:实际上这很慢,我建议创建一个函数,例如
function buildB(A, n)
A0 = A(1,1)
nA = size(A0, 1)
B = Array{eltype(A0),2}(undef, n * nA, n * nA)
for a in 1:n, j in 1:n
B[(a-1)*nA .+ (1:nA), (j-1)*nA .+ (1:nA)] .= A(a,j)
end
return B
end
还是考虑使用像BlockArrays.jl这样的软件包?
编辑2 这是BlockArrays.jl的示例:
using BlockArrays
function blockarrays(A, n)
A0 = A(1,1)
nA = size(A0, 1)
B = BlockArray{eltype(A0)}(undef_blocks, fill(nA,n), fill(nA,n))
for a in 1:n, j in 1:n
setblock!(B, A(a,j), a, j)
end
return B
end
哪个应该做你想做的事
julia> B = blockarrays(A, 2)
2×2-blocked 4×4 BlockArray{Int64,2}:
1 2 │ 2 4
2 4 │ 4 8
──────┼───────
2 4 │ 4 8
4 8 │ 8 16
julia> getblock(B, 1, 2)
2×2 Array{Int64,2}:
2 4
4 8
julia> B[4,2]
8