在Python中创建一个v7.3的.mat文件

4

我需要在Python或Matlab中进行涉及60000X70000矩阵的乘法运算。 我有16GB的RAM,并且能够轻松加载矩阵的每一行(这是我所需的)。 我能够在Python中创建整个矩阵,但无法在Matlab中完成。 是否有任何方法可以使用h5py或scipy将数组保存为.v7.3格式的.mat文件,以便我可以单独加载每一行?

1个回答

6
对于MATLAB v7.3,您可以使用需要h5py的hdf5storage。请在此处下载文件并提取,然后从命令提示符中键入:python setup.py install。 https://pypi.python.org/pypi/hdf5storage
import h5py
import hdf5storage
import numpy as np

matfiledata = {} # make a dictionary to store the MAT data in
matfiledata[u'variable1'] = np.zeros(100) # *** u prefix for variable name = unicode format, no issues thru Python 3.5; advise keeping u prefix indicator format based on feedback despite docs ***
matfiledata[u'variable2'] = np.ones(300)
hdf5storage.write(matfiledata, '.', 'example.mat', matlab_compatible=True)

如果 MATLAB 无法一次加载整个内容,我认为你需要将其保存在不同的变量中 matfiledata[u'chunk1'] matfiledata[u'chunk2'] matfiledata[u'chunk3'] 等等。

然后在 MATLAB 中,如果您将每个块保存为一个变量,则可以:

load(filename,'chunk1')
do stuff...
clear chunk1
load(filename,'chunk2')
do stuff...
clear chunk2
hdf5storage.savemat函数

hdf5storage.savemat函数有一个参数,可以让文件在将来正确地读入Python中,因此值得一试。它遵循scipy.io.loadmat格式... 如果从MATLAB保存数据以便轻松导入到Python中,您可以像这样做:

MATLAB    
save('example.mat','-v7.3')
Python
matdata = hdf5storage.loadmat('example.mat')

那会以字典的形式加载回Python,你可以将其转换为所需的任何数据类型。

你是否忘记将字典名称命名为u'name',这样它就成为了一个Unicode键? - Matt
谢谢!但是当我尝试执行hdf5storage.write命令时,出现了内存错误,有没有解决方法? - SH_V95
是的,我忘记了字典键的正确语法,但现在已经解决了。 - SH_V95
请注意,第一个示例显示您可以一次读取v7.3 MAT文件1列(只需将(:,1)与(1,:)相反以获取行:http://www.mathworks.com/help/matlab/import_export/load-parts-of-variables-from-mat-files.html并避免将整个MAT文件加载到内存中。这可以使您的内存使用量高达计算机支持的水平,而不会出现内存不足错误。 - Matt
使用for循环,其中i = 1到size(array,2)表示列,size(array,1)表示行,以分别循环遍历每个元素。可能有更好的方法可以将更多的向量组合在一起,但这是你最小化逐行或逐列内存使用的方式。 - Matt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接