如何使用 Fortran 90 将矩阵中的一列转换为多列

How to transform one column to much column on matrix using Fortran 90

我有一列 (im = 160648) 和一行 (jm = 1)。我想将其转换为大小为 (im = 344) 和 (jm=467)

的矩阵

我的程序代码是

  program matrix
  parameter (im=160648, jm=1)
  dimension h(im,jm)
  integer::h
  open (1,file="Hasil.txt", status='old')
  open (2,file="HasilNN.txt", status='unknown')
  do i=1,jm
         read(1,*)(h(i,j)),j=1,jm)
  end do

  do i=1,im
         write(2,33)(h(i,j),j=1,jm)
  end do
33 format(1x, 344f10.6)
  end program matrix

read(1,*)(h(i,j)),j=1,jm)

时出现的错误代码

the data type is floating data.

您的读取循环是:

  do i=1,jm
     read(1,*)(h(i,j)),j=1,jm)
  end do

do i=1,jm 不应该是 do i=1,im 吗? 这意味着格式化文本文件 Hasil.txt 中有 "im" 条记录(行),您的问题表明了这一点。

read(1,*)(h(i,j)),j=1,jm) 表示每条记录(文本行)有 "jm" 个值,即每行 1 个值。这是文件的样子吗? (此 read (lu,*) ... 语句将跳过未知数量的空行。)

您似乎想将此信息写入另一个文件; HasilNN.txt 使用 33 format (1x, 344f10.6) 建议每行 3441 个字符,尽管您的 write 语句每行只写 1 个值(如 jm=1)。对于一个文本文件来说,这将是一行很长的行,并且可能难以在程序之外进行管理。如果您确实希望这样做,可以使用隐含的 do 循环来实现,例如:

write(2,33) ((h(i,j),j=1,jm),I=1,im)

几点评论:

使用 jm = 1 意味着每一行只有一个值,可以等效地表示为一维向量 "dimension h(im)",不需要 j

文件单元编号 1 和 2 通常是为 screen/keyboard 保留的单元编号。你最好使用单元 11 和 12。

在设计此代码时,您需要解决 2 个文件中的记录结构,因为可以使用简单的向量。您可以使用格式控制行长度。 (1x,8f10.6) 的格式将创建 81 个字符的记录,这将更易于管理。

格式描述符 f10.6 还限制了您可以在文件中管理的值的范围。值 >= 1000 或 <= -100 将溢出此格式,而小于 1.e-6 的值将为零。

正如@francescalus 指出的那样,您已将 "h" 声明为整数,但使用了真实的格式描述符。这将产生一个 "Error : format-data mismatch" 并且必须更改为文件中预期的内容。

您应该考虑您希望实现的目标并调整代码。