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

Matlab Fortran-默认情况下以列形式写入磁盘?,matlab,io,fortran,Matlab,Io,Fortran,我正在编写一个简单的代码,将一些大型矩阵输出到磁盘,然后在matlab中读取 我已经编写了以下代码,举例说明了如何编写这样一个矩阵。我关心两件事: 写入磁盘的效率(寻找不太慢的东西) 易于在matlab中阅读 a 上面的程序将矩阵m1写入4327680 x 5。这使得在matlab中对其进行重塑变得很麻烦(尽管完全可能),因为在matlab中,我需要执行以下操作: 也许我的问题不够清楚。当Fortran编写该矩阵时,它编写的矩阵包含4327680行和5列。也就是说,当我在matlab中打开它时,

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

我已经编写了以下代码,举例说明了如何编写这样一个矩阵。我关心两件事:

  • 写入磁盘的效率(寻找不太慢的东西)
  • 易于在matlab中阅读
  • a

    上面的程序将矩阵
    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)
    作为第一个元素,
    m1(2,2,1,1,1,1,1,1)
    作为第二个元素<代码>m1(2,end,end,end,end,end,end,end,end)作为最后一个元素,等等

    或者,无论如何,我不知道,要快速地将它直接保存为
    .mat
    文件?

    “有没有办法将它作为一个向量来写,元素m1(2,1,1,1,1,1,1,1,1,1,1)作为第一个元素,m1(2,2,1,1,1,1,1,1)作为第二个元素,…,m1(2,end,end,end,end,end,end,end,end,end,end,end,end)作为最后一个元素,等等?”

    是的,这是默认的Fortran列主顺序。这是您的文件已写入的顺序。你什么都不用做

    “这使得在Matlab中对其进行重塑变得很麻烦(尽管完全可能),因为在Matlab中,我需要执行以下操作: m1=重塑(m1、n1、n2、n3、n4、n5、n6、n7、n8)”

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

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

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

    “2.易于在Matlab中阅读”

    要从Matlab中读取,请学习如何从Matlab文档和大量其他资源中读取二进制数据

    别忘了告诉Matlab正确的尺寸。或者将维度存储在数据文件的第一个字节(一个头)中。

    是否将其作为一个向量写入,元素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,end,end,end)作为最后一个元素,等等

    是的,这是默认的Fortran列主顺序。这是您的文件已写入的顺序。你什么都不用做

    “这使得在Matlab中对其进行重塑变得很麻烦(尽管完全可能),因为在Matlab中,我需要执行以下操作: m1=重塑(m1、n1、n2、n3、n4、n5、n6、n7、n8)”

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

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

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

    “2.易于在Matlab中阅读”

    要从Matlab中读取,请学习如何从Matlab文档和大量其他资源中读取二进制数据


    别忘了告诉Matlab正确的尺寸。或者将维度存储在数据文件(头文件)的第一个字节中。

    如果您关心效率,请使用未格式化的I/O,否则您将无能为力。另外,顺便说一句,Matlab和Fortran一样是column major,你能解释一下为什么它们不兼容,为什么Fortran的顺序很麻烦吗?这里多次处理来自Fortran的高效I/O,一遍又一遍地重复任何事情都没有意义。值得注意的是,您要求的顺序正是Fortran默认使用的顺序。我不明白你的问题。Fortran确实将
    m1(2,1,1,1,1,1,1)
    作为第一个元素,将
    m1(2,2,1,1,1,1,1,1)
    作为第二个元素!!!真的,有什么问题吗?嗨,弗拉基米尔。也许我不够清楚。请参阅上面的编辑。我已经搜索了未格式化的I/O,但似乎无法将文件名与之一起使用?我可以在stackoverflow或其他论坛上找到的关于高效I/O的大多数示例都是处理一维或二维矩阵的,而且扩展到更高维空间似乎并不简单。可以使用文件名,将其扩展到更高维空间也很简单。如果您关心效率,请使用无格式I/O,否则您就无能为力。另外,顺便说一句,Matlab和Fortran一样是column major,你能解释一下为什么它们不兼容,为什么Fortran的顺序很麻烦吗?这里多次处理来自Fortran的高效I/O,一遍又一遍地重复任何事情都没有意义。值得注意的是,您要求的顺序正是Fortran默认使用的顺序。我不明白你的问题。Fortran确实将
    m1(2,1,1,1,1,1,1)
    作为第一个元素,将
    m1(2,2,1,1,1,1,1,1)
    作为第二个元素!!!真的,有什么问题吗?嗨,弗拉基米尔。也许我不够清楚。请参阅上面的编辑。我已经搜索了未格式化的I/O,但似乎无法将文件名与之一起使用?我可以在stackoverflow或其他论坛上找到的关于高效I/O处理一维或二维矩阵的大多数示例,扩展到更高维空间似乎并不简单。您可以使用文件名,将其扩展到更高维也很简单。好的。我可以理解在matlab中重塑是很快的。我仍然希望避免这种情况,以使代码更加透明。另外,我需要使两个形状不是一个。只有直线m1=重塑(m1,n1,n2,n
    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)
    
    OPEN(UNIT=25,FILE=filename,ACCESS='stream',STATUS='replace',ACTION='write')
    WRITE(25)  m1(2,:,:,:,:,:,:,:,:)
    CLOSE(UNIT=25)