如何使用 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" 并且必须更改为文件中预期的内容。
您应该考虑您希望实现的目标并调整代码。
我有一列 (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" 并且必须更改为文件中预期的内容。
您应该考虑您希望实现的目标并调整代码。