在最简单的情况下,我想创建一个2 * 2马尔可夫转换矩阵作为程序的输入,如
A = [0:977 , 0:023
0:074 , 0:926 ]
在matlab,R或python中这将是微不足道的,但在像fortran这样的低级语言中似乎并不那么简单。我想我不能写一些类似
的内容 REAL,DIMENSION(2,2) :: P
P(1,1)= 0.977, P(1,2) = 0.023, P(2,1)= 0.074, P(2.2)=0.926
我做了一些搜索,我可能不得不使用read(*,*)
,但我不确定。所以告诉我该怎么做,谢谢。
----------补充----------
谢谢@Fl.pf。有用的指导
更具体的例子,我调整现有模块以添加两个新参数,两者都是矩阵形式
module parameters
implicit none
REAL, PARAMETER :: b = 0.99, d = 0.025, a = 0.36
REAL, PARAMETER :: klb = 0.01, inc = 0.025, kub = 45.0
INTEGER, PARAMETER :: length_grid_k = (kub-klb)/inc + 1
INTEGER, PARAMETER :: length_z = 2
REAL , PARAMETER :: toler = 1.e-4 ! Numerical tolerance
!REAL,DIMENSION(length_z,length_z) :: P ! Trasition matrix of technology process
REAL :: P(2,2)
P(1,:) = (/0.977, 0.023/)
P(2,:) = (/0.074, 0.926/)
!REAL,DIMENSION(2) :: y ! technology
REAL :: y(2,1)
y = (/1.25, 0.2/)
end module
正如您所看到的,P
和y
是我稍后添加的错误以及错误发生的位置。 gfortran编译器抛出错误消息,如:
Unexpected assignment statement in module
所以如果我不接受@ Fl.pf的回答。对于错误,我只能通过以下方式为矩阵分配值:1)通过real, allocatable, dimension(:,:); 2)
为矩阵分配空间,赋值allocate(transition(n_tauchen,n_tauchen))
。我对吗?但是一些代码提出了替代方案,例如下面的代码片段
program matrices
implicit none
integer :: i, j
real*8 :: a(4), b(4)
real*8 :: x(2, 4), y(4, 2), z(2, 2)
! initialize vectors and matrices
a = (/(dble(5-i), i=1, 4)/)
b = a+4d0
x(1, :) = (/1d0, 2d0, 3d0, 4d0/)
x(2, :) = (/5d0, 6d0, 7d0, 8d0/)
y = transpose(x)
z = matmul(x, y)
似乎他们直接将值分配给矩阵x
。我在这里有点混乱,有什么区别?