【问题标题】:Having trouble reading a text file into a Fortran array将文本文件读入 Fortran 数组时遇到问题
【发布时间】:2018-10-18 07:51:57
【问题描述】:

我正在编写一个程序,它必须从文本文件中读取线性方程组 Ax=Baugmented matrix (A|B),并将其存储到矩阵中以供以后求解。

我求解方程组的例程似乎有效,但我在读取文件本身时遇到了问题,这应该不会太难,但我现在很困惑。文本文件包含一个实数矩阵,其为N+1 条目宽(系数矩阵加上相应的独立项条目最后)和N 条目高。我的尝试(使用N=5 系统)是这样的:

        OPEN(10,FILE="sistema.txt")
            DO I=1,N
                DO J=1,(N+1)
                    IF(J==(N+1)) THEN
                        READ(10,*) B(I)
                        ELSE
                        READ(10,*) A(I,J)
                    END IF
                END DO
            END DO
    CLOSE(10)

A(1:N,1:n) 是一个实数数组,B(1:N) 也是一个实数数组(N 是用户输入的整数,用于在两种策略之间做出决定)。程序返回和文件结束错误,我尝试将循环的索引更改为 I=1,2J=1,3 只是为了看看会发生什么,但它一直返回相同的 EoF 错误。只有I=1,2J=1,2 才会读取文件,并且除了四个条目之外的所有条目都保持不变。我不明白发生了什么。

txt文件的内容,如果有帮助的话:

10.0 1.0 2.0 3.0 4.0 12.0
1.0 9.0 -1.0 2.0 -3.0 -27.0
2.0 -1.0 7.0 3.0 -5.0 14.0
3.0 2.0 3.0 12.0 -1.0 -17.0
4.0 -3.0 -5.0 -1.0 15.0 12.0

【问题讨论】:

  • 您应该真正向我们展示文件的外观。请不要将标签作为(Fortran)放入问题标题中,使单词成为标题的一部分。另外,我不知道 ampliated 是什么意思。
  • 嗨,弗拉基米尔。我不小心把这个名字用西班牙语翻译为增强矩阵的字面意思。现在已经更正了。
  • 好的,请出示您的文件。
  • 完成。我尝试了更多方法,但似乎程序在读取第一列后到达文件末尾。
  • 您的问题是每个read 都进入下一行。您需要使用单个读取语句读取每一行。类似read(..)a(i,:n),b(i)

标签: fortran eof


【解决方案1】:

命令READ 尝试读取整行,然后丢弃它不需要的所有内容。由于您只读取每个 read 的单个值,因此您只读取每行的第一个值,甚至没有将它们存储在正确的变量中。

这是我的阅读方式:

do i = 1, N
    read(10, *) A(:, i), B(i)
end do

我正在逐行读取它,将第一个值存储在A 的一行中,然后将最后一个值存储在B(i) 中。

更新 @agentp 注意到我上面的解决方案将值读取为

A(1,1) A(2,1) A(3,1) A(4,1) A(5,1) B(1)
A(1,2) A(2,2) A(3,2) A(4,2) A(5,2) B(2)
A(1,3) A(2,3) A(3,3) A(4,3) A(5,3) B(3)
A(1,4) A(2,4) A(3,4) A(4,4) A(5,4) B(4)
A(1,5) A(2,5) A(3,5) A(4,5) A(5,5) B(5)

这与您的代码建议您想要做的不同:

A(1,1) A(1,2) A(1,3) A(1,4) A(1,5) B(1)
A(2,1) A(2,2) A(2,3) ...
...

为了按此顺序阅读,您需要将read 行更改为:

read(10, *) A(i, :), B(i)

至于您的后续问题:如果您有任何数组 A(为简单起见 1D),您可以使用 A(3:7) 仅访问元素 3 到 7 进行读写。您可以省略从第一个元素到最后一个元素的任意数字:A(:7) 表示所有元素,包括索引为 7 的元素,A(3:) 表示所有元素从索引 3 开始。

相反,A(:) 将意味着 A 的所有元素在 1d 数组的情况下与仅使用 A 没有什么不同。但是如果A 是多维的,就像这里一样,它会很有用。在这种情况下,我使用了A(:,i),这意味着所有第二个索引为i的元素。

【讨论】:

  • 效果很好!谢谢,我很着急,无法使程序运行。我从未见过A(:,i) 的东西,我是个新手。数组索引所在的冒号是做什么用的?
  • @manual 这应该在您拥有的任何语言文档的开头。例如。 courses.physics.illinois.edu/phys466/sp2013/comp_info/… 。请注意,与问题中的代码相比,此答案是将a 的索引转置。
猜你喜欢
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-23
相关资源
最近更新 更多