我正在编写一个简单的代码来输出一些大型矩阵到磁盘上,这些矩阵将在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中我需要做的那样:
也许我的问题不够清楚。当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
文件?
答案 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正确的尺寸。或者将维度存储在数据文件的第一个字节中(标题)。