矩阵DFGRD1写入文件与控制台输出转置不符,求排查指导
问题排查:矩阵文件输出与控制台输出互为转置的原因
这其实不是矩阵本身被转置了,而是两种输出方式的遍历顺序不一样导致的——核心原因在于Fortran数组的列优先存储特性,咱们一步步拆解:
1. 两种输出方式的本质差异
- 你直接写
WRITE(105,*) DFGRD1输出整个数组时,Fortran会按照它的默认规则遍历元素:先输出第一列的所有行元素,再输出第二列,以此类推(列优先顺序)。 - 而控制台的DO循环
DO i=1,3; WRITE(7,*) (DFGRD1(i,j),j=1,3); END DO是行优先遍历:先固定行号i,再遍历该行的所有列j,输出整行的元素。
举个3x3矩阵的例子直观感受:
假设矩阵元素是DFGRD1(i,j)(i为行,j为列):
- 直接WRITE的输出顺序:
DFGRD1(1,1) → DFGRD1(2,1) → DFGRD1(3,1) → DFGRD1(1,2) → DFGRD1(2,2) → DFGRD1(3,2) → DFGRD1(1,3) → DFGRD1(2,3) → DFGRD1(3,3) - 循环输出的顺序:
DFGRD1(1,1) → DFGRD1(1,2) → DFGRD1(1,3) → DFGRD1(2,1) → DFGRD1(2,2) → DFGRD1(2,3) → DFGRD1(3,1) → DFGRD1(3,2) → DFGRD1(3,3)
你看,把文件里的输出按列重新分组,就能和控制台的行输出完全对应,反过来也一样,只是元素排列顺序不同而已,矩阵本身的结构并没有变。
2. 如何让两种输出一致?
如果你希望文件输出和控制台的行格式一致,把文件输出的代码改成和控制台一样的循环即可:
open(105,file='C:\temp17\FM.mtx') DO i=1,3 WRITE(105,*) (DFGRD1(i,j),j=1,3) END DO close(105)
如果反过来想让控制台输出和文件的列格式一致,就改成按列遍历的循环:
DO j=1,3 WRITE(7,*) (DFGRD1(i,j),i=1,3) END DO
总结
不用纠结哪一个是“真实值”——两种输出都是矩阵元素的正确输出,只是遍历顺序不同。Fortran的列优先是它的固有特性,只要统一输出的遍历逻辑,就能得到一致的结果。
内容的提问来源于stack exchange,提问作者RKM
相关产品推荐
相关产品推荐

