问题描述
我正在使用代码块和 gnu 编译器来运行 Fortran 代码,但我注意到一些非常奇怪的事情。
一旦我有一个数组 (1,2,3,...,16)
,如果我想重塑为一个 4x4 矩阵,我使用内置的 reshape
函数,理论上应该使用列主序为数字,所以给 {{ 1}};
相反,我得到 (1 5 9 13; 2 6 10 14; 3 7 11 15; 4 8 12 16)
。
这是一个重大的不一致,我想知道它是否与使用代码块或什么有关。
任何其他遇到此问题和/或对原因和解决方案有想法的人。
解决方法
我无法用 Intel Fortran oneAPI HPC
和代码供参考
program FortranConsole1
use,intrinsic :: iso_fortran_env
implicit none
interface show
procedure show_matrix_i,show_matrix_r,show_matrix_d
end interface
integer :: row(16),matrix(4,4)
real(real64) :: A(4,4)
row = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]
matrix = reshape( row,[4,4])
call show(matrix)
A = dble(matrix)
A = sqrt( matmul( transpose(A),A) )
call show(A,8)
call show(A,12)
call show(A,16)
contains
subroutine show_matrix_i(A,w)
! Display the matrix 'A' in columns
! A : the array of integers
! w : the column width. Default = 5
integer,intent(in) :: A(:,:)
integer,intent(in),optional :: w
integer :: i,j,n,m,wt
character(len=16) :: fmt
if(present(w)) then
wt = w
else
wt = 5
end if
n = size(A,1)
m = size(A,2)
write( fmt,"(a,g0,a)") "(*(g",wt,".0))"
write( *,fmt ) ( (A(i,j),j=1,m),new_line("A"),i=1,n )
end subroutine
subroutine show_matrix_r(A,w)
! Display the matrix 'A' in columns
! A : the array of real numbers
! w : the column width. deafult = 12
! s : sig. figures w-5 (calculated)
real(real32),dg,wt
character(len=16) :: fmt
if(present(w)) then
wt = w
else
wt = 12
end if
dg = wt-5
n = size(A,a,".","))"
write( *,n )
end subroutine
subroutine show_matrix_d(A,w)
! Display the matrix 'A' in columns
! A : the array of dble numbers
! w : the column width. default = 12
! Converts 'A' into single precision and calls `show_matrix_r`
real(real64),optional :: w
call show_matrix_r(real(A),w)
end subroutine
end program FortranConsole1
结果