Julia理解:将2D矩阵数组转换为2D矩阵

时间:2019-07-17 21:58:47

标签: julia

我正在使用Julia理解来实现以下目标:

给出一个矩阵 A = [1 2; 3 4]

我想将其扩展为

B = 
[1, 1, 1, 2, 2; 
 1, 1, 1, 2, 2;
 1, 1, 1, 2, 2;
 3, 3, 3, 4, 4;
 3, 3, 3, 4, 4]. 

现在我正在使用

ns = [3, 2]
B = [fill(B[i, j], ns[i], ns[j]) for i = 1:2, j = 1:2]

但是,它没有得到5x5的矩阵,而是给了我

2×2 Array{Array{Int64,2},2}:
 [0 0 0; 0 0 0; 0 0 0]  [0 0; 0 0; 0 0]
 [0 0 0; 0 0 0]         [0 0; 0 0]

那么我该如何将该二维矩阵数组转换为二维矩阵?还是有其他方法可以进行我需要的扩展?

1 个答案:

答案 0 :(得分:1)

这里有两种示例方法(第一种使用您的方法,第二种不生成中间矩阵):

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

julia> ns = [3, 2]
2-element Array{Int64,1}:
 3
 2

julia> hvcat(2, [fill(A[j, i], ns[j], ns[i]) for i = 1:2, j = 1:2]...)
5×5 Array{Int64,2}:
 1  1  1  2  2
 1  1  1  2  2
 1  1  1  2  2
 3  3  3  4  4
 3  3  3  4  4

julia> nsexpand = reduce(vcat, (fill(k, ns[k]) for k in axes(ns, 1)))
5-element Array{Int64,1}:
 1
 1
 1
 2
 2

julia> [A[i, j] for i in nsexpand, j in nsexpand]
5×5 Array{Int64,2}:
 1  1  1  2  2
 1  1  1  2  2
 1  1  1  2  2
 3  3  3  4  4
 3  3  3  4  4

编辑

这是另一个示例:

julia> A = [1 4 7 10
            2 5 8 11
            3 6 9 12]
3×4 Array{Int64,2}:
 1  4  7  10
 2  5  8  11
 3  6  9  12

julia> hvcat(3, A...)
4×3 Array{Int64,2}:
  1   2   3
  4   5   6
  7   8   9
 10  11  12

julia> vec(A)
12-element Array{Int64,1}:
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12

所以:

  • 第一个参数告诉您您要生成多少
  • hvcath之前有v,因此它需要元素按行
  • 但是数组可按列存储列明智

实际上,您必须创建临时数组作为目标的转置(因为hvcat将使用其来创建目标的数组)。实际上,这只是一个巧合-hvcat不知道您的原始元素是否存储在矩阵中(它将它们作为调用的位置参数,并且那时由于存储在矩阵中而丢失了事实)进行...操作。