我使用 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
所以:
- 第一个参数告诉您要生成多少列
hvcat
在v
之前有h
,因此它按行获取元素- 但是数组存储列按列
因此,实际上您必须创建临时数组作为目标的转置(因为 hvcat
将采用其列来创建行目标数组)。实际上这只是一个巧合 - hvcat 不知道您的原始元素存储在矩阵中(它将它们作为调用的位置参数,当时它们存储在矩阵中由于 ...
操作而丢失)。
关于 Julia 理解 : convert a 2d array of matrices to a 2d matrix,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57084543/