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

时间:2020-10-06 20:08:43

标签: arrays julia

我找不到这个简单问题的答案。

我有以下内容:

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变得很大时?

2 个答案:

答案 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
相关问题