我有九个矩阵,其维数为(N乘N)
A1(i,j),A2(i,j),A3(i,j),A4(i,j),A5(i,j),A6(i,j),A7(i,j),A8(i,j),A9(i,j)
然后我想构建一个更大的矩阵(3N乘3N),包括这九个矩阵:
A = [A1 A2 A3
A4 A5 A6
A7 A8 A9]
Run Code Online (Sandbox Code Playgroud)
在fortran中,我可以使用命令行吗?
do i=1,FN
do j=1,FML
A(i,j) = [A1(i,j),A2(i,j),A3(i,j);A4(i,j),A5(i,j),A6(i,j);A7(i,j),A8(i,j),A9(i,j)]
end do
end do
Run Code Online (Sandbox Code Playgroud)
只是为了好玩,你也可以使用do-loops作为大A矩阵
do i = 1, N
A( i, : ) = [ A1( i,: ), A2( i,: ), A3( i,: ) ]
A( i + N, : ) = [ A4( i,: ), A5( i,: ), A6( i,: ) ]
A( i + N*2, : ) = [ A7( i,: ), A8( i,: ), A9( i,: ) ]
enddo
Run Code Online (Sandbox Code Playgroud)
它以行主方式填充A矩阵,因此小矩阵也以这种方式出现.如果真的非常必要,这也可以写成一行
A = transpose( reshape( &
[ ( [ A1( i,: ), A2( i,: ), A3( i,: ) ], i=1,N ), &
( [ A4( i,: ), A5( i,: ), A6( i,: ) ], i=1,N ), &
( [ A7( i,: ), A8( i,: ), A9( i,: ) ], i=1,N ) ], [N*3, N*3] ))
Run Code Online (Sandbox Code Playgroud)
原来是@francescalus答案中的第二个数组构造函数的转置(单行形式)
A = reshape( &
[ ( [ A1( :,i ), A4( :,i ), A7( :,i ) ], i=1,N ), &
( [ A2( :,i ), A5( :,i ), A8( :,i ) ], i=1,N ), &
( [ A3( :,i ), A6( :,i ), A9( :,i ) ], i=1,N ) ], [N*3, N*3] )
Run Code Online (Sandbox Code Playgroud)
为了更进一步,我们可以像在其他语言中一样定义hcat和vcat例程(请注意,显式接口是必需的):
function hcat( A, B, C ) result( X )
integer, dimension(:,:) :: A, B, C
integer :: X( size(A,1), size(A,2)+size(B,2)+size(C,2) )
X = reshape( [ A, B, C ], shape( X ) )
endfunction
function vcat( A, B, C ) result( X )
integer, dimension(:,:) :: A, B, C
integer :: X( size(A,1)+size(B,1)+size(C,1), size(A,2) )
X = transpose( reshape( &
[ transpose(A), transpose(B), transpose(C) ], &
[ size(X,2), size(X,1) ] ) )
endfunction
Run Code Online (Sandbox Code Playgroud)
那我们就可以写了
A = vcat( hcat( A1, A2, A3 ), hcat( A4, A5, A6 ), hcat( A7, A8, A9 ) )
Run Code Online (Sandbox Code Playgroud)
这与问题中所需的形式有点类似:
A = [ A1 A2 A3 ; A4 A5 A6 ; A7 A8 A9 ]
Run Code Online (Sandbox Code Playgroud)