代码之家  ›  专栏  ›  技术社区  ›  phdstudent

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

  •  0
  • phdstudent  · 技术社区  · 9 年前

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

    1. 磁盘写入效率(寻找速度不太慢的东西)
    2. 易于在matlab中读取

    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中,我需要执行以下操作:

    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 回复  |  直到 9 年前
        1
  •  2
  •   Vladimir F Героям слава    9 年前

    “是否可以将其写成一个向量,其中元素m1(2,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)作为最后一个元素,等等? "

    “这使得在Matlab中对其进行整形很麻烦(尽管完全可能),因为在Matlab中,我需要执行以下操作:

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

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

    使用未格式化(也称为二进制)输入/输出:

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

    “2.易于在Matlab中读取 "

    Read and write from/to a binary file in Matlab 来自Matlab文档 https://www.mathworks.com/help/matlab/ref/fread.html