如何在fortran中为矩阵赋值?

时间:2016-03-13 12:43:23

标签: matrix fortran

在最简单的情况下,我想创建一个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

正如您所看到的,Py是我稍后添加的错误以及错误发生的位置。 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。我在这里有点混乱,有什么区别?

0 个答案:

没有答案