Julia 理解 : convert a 2d array of matrices to a 2d matrix

标签 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]

那么我应该如何将这个二维矩阵数组转换为二维矩阵?或者还有其他方法来完成我需要的扩展吗?

最佳答案

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

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

所以:

  • 第一个参数告诉您要生成多少
  • hvcatv 之前有 h,因此它按行获取元素
  • 但是数组存储列按列

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

关于 Julia 理解 : convert a 2d array of matrices to a 2d matrix,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57084543/

相关文章:

julia - 在 Julia 中使用 Lsq-Fit

julia - 在 Julia 中计算 IRR

julia - 如何识别不同的成员(member)?

matrix - Julia 中的整数矩阵可视化

julia - 如何从 `Enum` 或 `String` 列表创建 `Symbol` ?

julia - 如何在 Julia 中智能地将一个参数应用于 Array{Function, 1} 元素?

julia - 等价于 Julia 中的 c\c++ 编译器指令

multithreading - 如何杀死 Julia 中的任务?

recursion - 如何在 Julia 中创建递归类型别名?

python - 理解这个 Julia 代码并将其翻译成 Python