从Fortran95中的向量构建矩阵

时间:2018-01-25 15:58:09

标签: arrays matrix vector fortran fortran95

通过使用以下代码,我试图构建一个3 * 3矩阵,但无法这样做。任何帮助将不胜感激。

program array

  implicit none
  integer i, a(5), b(5), a1(5), a2(5), a3(5)
  integer, dimension (5,5) :: mat1

  a = [0,1,2,3,4]
  b = [1,2,2,2,1]

  i = 0
  do i = 1,5
    a1(i) = a(i)*a(i)
    a2(i) = a(i)
    a3(i) = 1
    print*, a1(i), a2(i), a3(i)
  end do

  do i=1,5
    mat1(i,:) = [a1(:,i),a2(:,i),a3(:,i)]
    print*, mat1
  end do

end program array

在我的输出中,我期望有一个5 * 3矩阵,其中[a1; a2; A3。但是,我收到以下错误。

$ gfortran -Wall -c "HW1.f95" #(in directory: Y:\Fortran & subroutines)

HW1.f95:28.20:
mat1(:,i) = [a1(:,i);a2(:,i);a3(:,i)]
                1
Error: Syntax error in array constructor at (1)
HW1.f95:28.26:
mat1(:,i) = [a1(:,i);a2(:,i);a3(:,i)]
                      1
Error: Invalid character in name at (1)
HW1.f95:28.34:
mat1(:,i) = [a1(:,i);a2(:,i);a3(:,i)]
                              1
Error: Invalid character in name at (1)
Compilation failed.

2 个答案:

答案 0 :(得分:0)

程序中编译失败有两个原因

  • 你说你是

      

    期望有一个5 * 3矩阵

    为此,您需要在声明中声明mat1为5 * 3矩阵,如

    integer, dimension (5,3) :: mat1
    

    或者稍后只写上前三个条目,比如

    do i=1,5
      mat1(i,1:3) = [a1(i),a2(i),a3(i)]
      print*, mat1
    end do
    

    第二个opiton仍会留下一个5 * 5的矩阵,但它只会填入第一个树列。

  • 您宣布a1a2a3为一维。正如@francescalus在评论中已经指出的那样,你试图访问那些数组,就像它们有两个维度一样,但这些维度并不起作用。这是一种可能性

    mat1(i,1:3) = [a1(i),a2(i),a3(i)]
    

答案 1 :(得分:0)

将三个长度为5的数组(a2,a2,a3)放入一个长度为15的数组中并使用RESHAPE:

program fill_mat1
    integer, dimension(5,3) :: mat1
    integer, dimension(5)   :: a1,a2,a3
    integer, dimension(15)  :: a123

    a1 = (/  1, 2, 3, 4, 5 /)
    a2 = (/  6, 7, 8, 9,10 /)
    a3 = (/ 11,12,13,14,15 /)
    a123(1:5)   = a1
    a123(6:10)  = a2
    a123(11:15) = a3
    mat1 = RESHAPE(a123,mat1)
end program

RESHAPE从a123获取值,并以Fortran标准顺序将它们填充为mat1的形状。当列表和形状之间的元素数量不一致时,还有用于排序值和填充的选项。这些都包含在RESHAPE内在文档中。