python怎么读取matlab的mat文件,matlab读取mat文件中mat数据

  python怎么读取matlab的mat文件,matlab读取mat文件中mat数据

  本文主要介绍python如何处理matlab的mat数据,具有很好的参考价值。希望对大家有帮助。如有错误或不足之处,请不吝赐教。

  00-1010 mat MATLAB *的数据处理。mat格式数据和常见错误汇总1。数据读取错误2。数据类型错误

  

目录

  Python和matlab是两种常用的实验室平台工具。在一些应用中,这两个不同平台的数据会相互处理,如何读取和保存就显得尤为重要。这里需要用到python第三方平台下的scipy模块。

  使用以下命令检查是否下载了scipy。

  导入副本

  如果报告了错误,请下载并使用python install scipy或conda install scipy安装它。

  您需要在scipy的输入和输出类中使用loadmat和savemat方法:

  将scipy.io作为sio导入

  sio.loadmat(文件名,mdict=无,appendmat=真,**kwargs)

  sio.savemat(文件名,mdict,appendmat=True,格式=5 ,长字段名称=False,do_compression=False,oned_as=row

  下面是一个简单的错误示例:(需要传递字典格式的参数)

  将scipy.io作为sio导入

  将numpy作为np导入

  x=np.ones((3,3))

  x

  [86]:

  数组([[1。 1. 1.],

  [1. 1. 1.],

  [1. 1. 1.]])

  sio.savemat(f.mat ,x)

  回溯(最近呼叫):

  模块中文件 ipython-input-87-d739bc03c885 第1行

  sio.savemat(f.mat ,x)

  下面是一个简单的保存和导入示例:

  将scipy.io作为sio导入

  将numpy作为np导入

  x=np.ones((3,3))

  x

  [86]:

  数组([[1。 1. 1.],

  [1. 1. 1.],

  [1. 1. 1.]])

  sio.savemat(f.mat ,{x:x})

  myMat=sio.loadmat(f.mat )

  Print(myMat) #作为字典输出

  { _ _ header _ _ : b MATLAB 5.0 MAT-file platform : nt,创建于: Fri 2020年8月21日16:29:37 , __version__: 1.0 , __globals__: [], x:数组([[1 . 1. 1.],

  [1. 1. 1.],

  [1. 1. 1.]])}

  #保存名称键,输出列表值

  打印(myMat[x])

  [[1.1.1.]

  [1.1.1.]

  [1.1.1.]]

  如果要将python数据保存为mat数据,需要cell格式的数据,但是python并没有实现cell,所以需要numpy模块。你可以看看这个博客。

  

处理matlab的mat数据

  由于matlab和python的编程方式不同,有时在编译程序时需要使用python调用matlab中的格式数据。下面是如何调用mat格式数据和常见错误的解决方法,仅供参考!

  

处理matlab的*.mat格式数据及常见错误汇总

  #最初使用loadmat读取数据

  将numpy作为np导入

  从scipy.io导入loadmat

  img=load mat( im . mat )[im]# im . mat是mat数据的名称,用[ im ]表示

  im表示该文件下im的数据

  

  使用如上代码读取数据时,会出现如下错误:

  

  如果出现以上错误,改用下面方式读取,

  

import h5py

  img = h5py.File(im.mat)[im]

  img = h5py.File(im.mat,r)[im] # 无警告

  

  

  

二、数据类型错误

  (用Python处理图像时,若涉及加减运算,溢出差值被重新赋值255-0)

  

# python代码

  import h5py

  import numpy as np

  img = h5py.File(im.mat)[im]

  # python中的M,N刚刚好与matlab中的M,N取值相反,此处进行转置与matlab相同矩阵格式进行处理

  x = np.array(img).T

  [M, N] = x.shape

  if M < 16 and N < 16:

   score = -2

  # Feature Extraction:

  # 1. horizontal features

  d_h = x[:, 1:N] - x[:, 0:N - 1] # 该步操作图像产生满溢,溢出后差值可能都被赋为255,依次递减

  

  此种情况下,d_h数据会出现满溢情况,下面就是相同数据在python和matlab下面进行运算的差异性。

  

  

% Matlab 代码

  img = laod(im.mat)

  [M, N] = size(x)

  if M < 16 N < 16

   score = -2;

  end

  x = double(img); % 将无符号类型uint8数据类型转换为double类型

  % Feature Extraction:

  % 1. horizontal features

  d_h = x(:, 2:N) - x(:, 1:(N-1));

  

  

  原因: 导入数据类型为 uint8 数据格式,该种格式下是没有负数的,在matlab中进行运算时,先将uint8数据类型转化为了double类型,然后进行了减法运算,所以会出现如上结果,但是在python中,由于没有double类型,所以需要自己手动设置数据格式类型,只需要改成不是uint8格式即可(具体格式需要根据需求,此处改成了int8格式类型)。解决方法非常简单,只需在上面的一行代码中加入数据类型即可:

  

x = np.array(img,dtype = int8).T # 对读取的uint8格式数据进行重新定义一下格式即可

  x = np.array(img,dtype = float).T # 下面这种格式虽然是浮点型,但是计算过程不容易出错,如果是上面的int8会出现部分错误,需要注意

  

  现在看一下结果,就跟matlab处理结果一样了。

  

  虽然下面是浮点型,但是能够保证数据转化的精度和准确性,img的影像数据转化成数值时不出错误,非必要情况下,不要使用int8数据格式,因为使用int8格式数据类型,会在某些部分出错,这一定要注意。(改组数据中(0,80)数值在int8格式转化时出错,原始数值为129,转化之后变成127,而使用float格式则不会出现错误)

  

  原始数据unit8数据格式类型的数值为129,在python中不同格式类型的值就不一样。

  

  所以uint8格式,在python运算中还是转换成float格式靠谱,转换成int8真的不行呀!

  以上为个人经验,希望能给大家一个参考,也希望大家多多支持盛行IT软件开发工作室。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: