Fortran - 默认情况下写入磁盘列?

时间:2017-08-10 13:44:23

标签: matlab io fortran

我正在编写一个简单的代码来输出一些大型矩阵到磁盘上,这些矩阵将在matlab中读取。

我编写了以下代码,这个代码用于编写一个这样的矩阵。我关注两件事:

  1. 写入磁盘的效率(寻找不太慢的东西)
  2. 很容易在matlab中阅读
  3. PROGRAM WriteDisk
    
    character(80)  :: filename = ' '    
    INTEGER :: indt
    INTEGER :: ind1, n1 = 161
    INTEGER :: ind2, n2=20
    INTEGER :: ind3, n3=2
    INTEGER :: ind4, n4=2
    INTEGER :: ind5, n5=21
    INTEGER :: ind6, n6=20
    INTEGER :: ind7, n7=2
    INTEGER :: ind8, n8=2
    
    INTEGER :: dummy    
    REAL, ALLOCATABLE :: m1(:,:,:,:,:,:,:,:,:)
    ALLOCATE(m1(2,n1,n2,n3,n4,n5,n6,n7,n8))   
    
    
    dummy = 1
    
    do ind8 = 1,n8
    do ind7 = 1,n7
    do ind6 = 1,n6    
    do ind5 = 1,n5
    do ind4 = 1,n4        
    do ind3 = 1,n3        
    do ind2 = 1,n2      
    do ind1=1,n1    
    
        m1(2,ind1,ind2,ind3,ind4,ind5,ind6,ind7,ind8) = dummy
        dummy = dummy + 1
    
    end do
    end do
    end do
    end do
    end do
    end do
    end do
    end do
    
    indt = 1
    write(filename,'(a,i0,a)')'PF_m1_',indt,'.txt'    
    OPEN(UNIT=25,FILE=filename,STATUS='replace',ACTION='write')
    WRITE(25, *)  m1(2,:,:,:,:,:,:,:,:)
    CLOSE(UNIT=25)
    
    
    
    END PROGRAM
    

    上面的程序将矩阵m1写为4327680 x 5。这使得在matlab中重塑它变得很麻烦(虽然完全可能),就像在Matlab中我需要做的那样:

    也许我的问题不够清楚。当Fortran写入该矩阵时,它写入的是4327680行和5列。即当我在matlab中打开它时,我必须做一些像原始格式的矩阵:

    n1 = 161;
    n2 = 20;
    n3 = 2;
    n4 = 2;
    n5 = 21;
    n6 = 20;
    n7 = 2;
    n8 = 2;
    
    m1 = load('PF_m1_1.txt'); %This is a two dimensional matrix that needs to be transposed and reshaped TWICE to get the original matrix
    m1 = m1';
    m1 = m1(:);
    m1 = reshape(m1, n1,n2,n3,n4,n5,n6,n7,n8)
    

    无论如何将它作为单个向量写入,元素以元素m1(2,1,1,1,1,1,1,1,1)作为第一个元素,m1(2,2,1,1,1,1,1,1,1)作为第二个元素,...,m1(2,end,end,end,end,end,end,end,end)作为最后一个元素,等等?

    或者我不知道,将其直接快速保存为.mat文件?

1 个答案:

答案 0 :(得分:2)

“无论如何将它作为单个向量写入,元素为元素m1(2,1,1,1,1,1,1,1,1)作为第一个元素,m1(2,2 ,1,1,1,1,1,1,1)作为第二个元素,...,m1(2,结束,结束,结束,结束,结束,结束,结束,结束)作为最后一个元素,等等? / EM>“

是的,这是默认的Fortran列主要订单。这是您的文件已编写的顺序。你无需做任何事情。

“这使得在Matlab中重塑它很麻烦(虽然完全可行),就像在Matlab中我需要做的如下: m1 =重塑(m1,n1,n2,n3,n4,n5,n6,n7,n8)“

重塑只是更新内部描述符。它应该是一个非常快速的操作。完全可以忽略不计。即使它需要对数据进行洗牌,它仍然比从硬盘驱动器读取要快得多。

“我关注两件事:1。写入磁盘的效率(寻找不太慢的东西)”

使用未格式化的(也称为二进制)I / O:

OPEN(UNIT=25,FILE=filename,ACCESS='stream',STATUS='replace',ACTION='write')
WRITE(25)  m1(2,:,:,:,:,:,:,:,:)
CLOSE(UNIT=25)

“2.很容易在Matlab中阅读

要从Matlab读取它,请学习如何从Matlab文档Read and write from/to a binary file in Matlab和其他资源的大量读取https://www.mathworks.com/help/matlab/ref/fread.html中的二进制数据。

不要忘记告诉Matlab正确的尺寸。或者将维度存储在数据文件的第一个字节中(标题)。