Matlab中的mat数据转成python中使用的npy数据遇到的坑及解决

   2023-02-07 学习力0
核心提示:目录Matlab中的Cellcell的读取cell和mat矩阵的转换Matlab中的reshape和permutereshapepermute总结最近做的工作涉及将matlab中的处理好的mat数据转换成npy数据,送入到网络中学习。在处理数据时遇到的一些问题总结如下。Matlab中的Cellcell数组的数组(指的是

最近做的工作涉及将matlab中的处理好的mat数据转换成npy数据,送入到网络中学习。在处理数据时遇到的一些问题总结如下。

Matlab中的Cell

cell数组的数组(指的是两层cell)不能使用cell2mat函数

为了解决这个问题,涉及matlab中元组数据的读取和保存。

cell的读取

cell的{}是指向cell的内容,而cell的()是指向cell的位置。

cell和mat矩阵的转换

单个的cell转换成mat可以直接使用cell2mat函数。

cell2mat:将元胞数组成普通矩阵(要求cell元胞数组的所有内容都必须为相同数据类型,可以为字符,会转化为字符矩阵)

如果是两层以上的cell可以自己写循环依次将数据读出来,存入另一个数据中。

for i=1:n_actions_train
     for j=1:n_num
         matrix_train(i,j,:,:,:)=train_fea{i}{j};  %train_fea是cell数据
     end     
 end

Matlab中的reshape和permute

reshape

重构函数,将给定的数据重构成我们需要的size的数据。

用法:

B = reshape(A,sz)
B = reshape(A,sz1,...,szN)

B = reshape(A,sz) 使用大小向量 sz 重构 A 以定义 size(B)。

例如,reshape(A,[2,3]) 将 A 重构为一个 2×3 矩阵。

sz 必须至少包含 2 个元素,prod(sz) 必须与 numel(A) 相同。

% eg. 1: 将 1×10 向量重构为 5×2 矩阵。
A = 1:10;
B = reshape(A,[5,2])

每个维度的大小,指定为具有最多一个 [](可选)的两个或以上的整数。必须至少指定 2 个维度大小,并且最多一个维度大小可以指定为 [],这样会自动计算该维度的大小以确保 numel(B) 与 numel(A) 相匹配。

当使用 [] 自动计算维度大小时,显式指定的维度必须均匀划分为输入矩阵 numel(A) 中的元素数目。

对于第二个维度以上的维度,输出 B 不反映大小为 1 的尾部维度。例如,reshape(A,3,2,1,1) 生成 3×2 矩阵。

permute

置换数组维度

B = permute(A,dimorder)

eg. 1 : 创建一个 3×4×2 数组并对其进行置换,交换第一个维度和第三个维度,从而得到 2×4×3 数组.
A = rand(3,4,2)
B = permute(A,[3 2 1])

reshape和permute函数的区别主要在于reshape会改变数据的维度,但数据总量是不变的,只是按原来数据的行列组合变化到新的数据排列方式,其中每个维度的size都可能发生变化。

permute函数只是调换数据维度的顺序,比如我们要从某个数据中拿到某两个维度之间的矩阵,我们可以先用这个函数将这两个维度先调到外面,方便我们取。

这个函数不会改变每个维度的size。

Please use HDF reader for matlab v7.3 files

matlab中对于较大打mat文件,都建议使用v7.3 来保存数据,但是scipy包中的loadmat函数不能读取这个版本的数据,搜了一下问题,发现h5py包中的File函数可以读取这个数据,添加h5py后使用h5py.File()函数就可以读取了。

IndexError: only integers, slices (:), ellipsis (...)……

经检查,错误之处在索引处使用了浮点数,把matlab中获得的数据强制转换成int型。

因为matlab中数据默认保存成double数据,所以如果转换到其他语言时,要注意到这一点,并且提前强制转换。

IndexError: index *** is out of bounds for axis 1 with size ***

问题在于下表越界,因为从matlab中获得的邻接矩阵记录邻居时,下标从1开始,而python中默认下标从0开始。

值得注意的是matlab中下标维度都是从1开始的,而且matlab中的矩阵读取顺序是列优先的,其他语言比如python和C++都是行优先的。所以数据迁移过去都需要先transpose。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。

原文地址:https://blog.csdn.net/faithfulzl/article/details/106810518
 
标签: Matlab mat python npy
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • 如何在Abaqus的python中调用Matlab程序
    目录1. 确定版本信息2. 备份python3. 设置环境变量4. 安装程序5. 调试运行参考资料Abaqus2018操作系统Win10 64位Python版本2.7(路径C:\SIMULIA\CAE\2018\win_b64\tools\SMApy\python2.7)2. 备份python将上述的“python2.7”文件夹复制出来,避免因操作错误
    03-16
  • 如何将极坐标数据转换为笛卡尔坐标系并绘制[MATLAB]
    如何将极坐标数据转换为笛卡尔坐标系并绘制[MAT
    你想做的事考虑根据与原点的距离 $r$ 和 $xy$ 平面上的角度 $heta$ 绘制数据 $P(r, heta)$。例如,雷达获取的信号包含有关目标范围 $r$ 和方位角 $heta$ 的信息。就是下图。在本文中,$heta$ 是从 $x$ 轴测量的角度。显示示例考虑创建依赖于 $r, heta$ 的虚拟
    03-16
  • 【MATLAB与机械设计】一维优化进退法确定初始区间
    【MATLAB与机械设计】一维优化进退法确定初始区
    在讨论一维搜索时,首先保证搜索区间函数具有单峰性,也就是在区间[a,b]中函数是凸函数,对于求极小值问题,函数值具有高—低—高的特性,在区间[a,b]上有唯一的最小值。1,方法的建立2.进退法确定搜索区间的程序框图3,根据上述的程序框图,编写的MATLAB程序
    03-08
  • 用于微型四轮驱动的 6T 小齿轮原型和使用 MATLAB 的 FEM 结构分析
    用于微型四轮驱动的 6T 小齿轮原型和使用 MATLA
    介绍我使用迷你 4WD 套件使用 Raspberry Pi 制作机器人汽车。定制零件丰富且方便,因为它们在附近的商店很容易买到。但是,由于Mini 4WD的速度非常快,因此在低速时很难控制速度。因此,我使用 3D 打印机制作了自己的 6T 小齿轮,并尝试改变齿轮比。 成型小齿
    03-08
  • ROS与Matlab系列:一个简单的运动控制 基于matl
    转自:http://blog.exbot.net/archives/2594Matlab拥有强大的数据处理、可视化绘图能力以及众多成熟的算法函数,非常适合算法开发;在控制系统设计中,Simulink也是普遍使用的设计和仿真工具。而ROS系统,则是一种新的标准化机器人系统软件框架。通过ROS,你
    02-10
  • matlab 遍历结构体struc的成员
    MATLAB中专门用于对结构数组的操作的函数并不多,通过 help datatypes获取数据类型列表,可以看到其中的结构数据类型的有关的函数,主要如表4.3.1所示。表4.3.1 结构数组的操作函数函数名             功能描述 deal                 把输入处
    02-09
  • 02-09
  • schroeder reverb matlab实现
    schroeder reverb matlab实现
    原理参考:Natural sounding artificial reverberation combFilter.m:function output = combFilter(delay, gain, input)fs = 48000;delaySample = int32(delayTime * fs / 1000);B = [1 zeros(1, delaySample - 1)];A=[1 zeros(1, delaySample - 2) -gain];
    02-09
  • C/C++中调用matlab引擎计算 matlab转c
    原帖地址:http://blog.sina.com.cn/s/blog_6adcb3530101cvot.html一,在linux环境使用matlab引擎必须先进行一些必要的配置1,matlab引擎依赖/bin/csh启动,所以不管你使用何种shell,都必须安装csh。**2,matlab引擎依赖的动态库文件目录必须在系统当前的
    02-09
  • MATLAB 图像放大/缩小,双线性插值
    MATLAB 图像放大/缩小,双线性插值
    半年前写过matlab最邻近插值的图像缩放,没怎么考虑边界问题。更早之前用Opencv写过双线性插值图像放大,不过写的比较混乱。所以这里用matlab重新再清楚的写一遍。 1 close all; 2 clear all; 3 clc; 45 m=1.8;%放大或缩小的高度 6 n=2.3;%放大或缩小的宽度 7
    02-09
点击排行