制作矩阵矩阵

时间:2018-01-04 04:07:28

标签: julia

我想要一个矩阵,其元素也是矩阵。

例如

A=[[1 2 3;3 4 1;2 3 6]  [1 4 5;4 8 7;2 0 1];[1 5 8;6 4 7;2 0 0]  [2 1 5;4 7 7;2 4 6]]

如何在Julia中制作这个矩阵?

4 个答案:

答案 0 :(得分:2)

A = first.([([1 2 3;3 4 1;2 3 6],) ([1 4 5;4 8 7;2 0 1],);
            ([1 5 8;6 4 7;2 0 0],) ([2 1 5;4 7 7;2 4 6],)])

有效(在Julia 0.6上)。使元素元组停止子矩阵的融合,然后first.解决它们。

答案 1 :(得分:1)

我不确定速记/文字,但你可以构建它然后填充它:

B=Matrix{Matrix}(3,3)
Out[4]:
3×3 Array{Array{T,2} where T,2}:
 #undef  #undef  #undef
 #undef  #undef  #undef
 #undef  #undef  #undef
B[1,1]=[1 2 ; 3 4]
B
Out[8]:
3×3 Array{Array{T,2} where T,2}:
    [1 2; 3 4]  #undef  #undef
 #undef         #undef  #undef
 #undef         #undef  #undef

答案 2 :(得分:1)

我不知道为什么朱莉娅有这个(来自我的POV奇怪)财产:

julia> [1 2 [3 4]]
1×4 Array{Int64,2}:
 1  2  3  4

但是我们可以用它来制作这个技巧:

julia> A=[[[1 2 3;3 4 1;2 3 6]] [[1 4 5;4 8 7;2 0 1]];
          [[1 5 8;6 4 7;2 0 0]] [[2 1 5;4 7 7;2 4 6]]]

另一个奇怪的可能性是(请注意它是视觉上转置的!):

julia> A=hcat([[1 2 3;3 4 1;2 3 6], [2 1 5;4 7 7;2 4 6]], 
              [[1 4 5;4 8 7;2 0 1], [1 5 8;6 4 7;2 0 0]])

或(这也需要在视觉上转换!)

julia> A=reshape([[1 2 3;3 4 1;2 3 6], [2 1 5;4 7 7;2 4 6], 
                  [1 4 5;4 8 7;2 0 1], [1 5 8;6 4 7;2 0 0],], 
                 (2,2))

修改 提出您的其他问题 - 您可以创建所需长度的数组,然后使用重塑:

U = reshape(Matrix{Float64}[zeros(8, 5) for i in 1:20*20], (20,20));

答案 3 :(得分:0)

您可以首先通过以下方式创建上述尺寸的空矩阵:

X = zeros(Int64, (3, 3,4))

您可以相应地进一步分配每个矩阵:

X[:,:,1] = [1 2 3;3 4 1;2 3 6]
X[:,:,2] = [1 4 5;4 8 7;2 0 1]
X[:,:,3] = [1 5 8;6 4 7;2 0 0]
X[:,:,4] = [2 1 5;4 7 7;2 4 6]

矩阵X为:

julia > X
julia > 3×3×4 Array{Int64,3}:
[:, :, 1] =
1  2  3
3  4  1
2  3  6

[:, :, 2] =
1  4  5
4  8  7
2  0  1

[:, :, 3] =
1  5  8
6  4  7
2  0  0

[:, :, 4] =
2  1  5
4  7  7
2  4  6

更容易做到的是通过矢量按原样读取每个元素并对其进行整形。

x = [1,2,3,3,4,1,2,3,6,1,4,5,4,8,7,2,0,1,1,5,8,6,4,7,2,0,0,2,1,5,4,7,7,2,4,6]
x = reshape(x, (3, 3, 4))

这将导致需要转置的4个矩阵,因此您可以将permutedims作为对象来更改第一维和第二维(每个矩阵)的顺序:

 permutedims(x,(2,1,3))