我正在使用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]
那么我该如何将该二维矩阵数组转换为二维矩阵?还是有其他方法可以进行我需要的扩展?
答案 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
所以:
hvcat
在h
之前有v
,因此它需要元素按行 实际上,您必须创建临时数组作为目标的转置(因为hvcat
将使用其列来创建目标的行数组)。实际上,这只是一个巧合-hvcat
不知道您的原始元素是否存储在矩阵中(它将它们作为调用的位置参数,并且那时由于存储在矩阵中而丢失了事实)进行...
操作。