精华内容
下载资源
问答
  • 可用的存储方式如数据库、文件存储等:如果用数据库存储,不太适合选关系型数据库,可以考虑时间序列数据库或key-value数据库,需要一些学习成本;使用文件存储比较简单,如每爬一次,将数据保存为一个csv文件,但这...

    d32e00426c853441068ab51f7af41a4e.png

    最近有个爬数据的任务,数据量不小,总共有上百G,但每次爬只是一个数组,几兆大小,那如何存储这样零碎的数据呢?

    可用的存储方式如数据库、文件存储等:

    • 如果用数据库存储,不太适合选关系型数据库,可以考虑时间序列数据库或key-value数据库,需要一些学习成本;
    • 使用文件存储比较简单,如每爬一次,将数据保存为一个csv文件,但这会带来文件数量大的问题,不利于数据搬移。

    下面介绍一种Matlab提供的大数据存储方式:matfile。它本质就是一个mat文件,但matfile可以直接向其保存或加载部分变量,避免了大数据的内存载入。相对于 load 或 save 函数,使用 matfile 函数的主要优点是对于太大而无法装入内存中的数据集,可以仅处理该数据集的一部分。本质上,其使用了 HDF5 格式。

    1、整变量写入mat文件

    %% 整变量写入
    filename = 'myFile.mat';
    % 方式1
    x = magic(20); 
    save(filename, 'x');
    % 方式2
    m = matfile(filename, 'Writable', true);
    y = magic(15);
    m.y = y;
    disp(m)

    结果如下

     Properties:
          Properties.Source: '.myFile.mat'
        Properties.Writable: true                                             
                          x: [20x20 double]                                   
                          y: [15x15 double]    

    可以使用whos查看文件中的变量信息:

    >> whos('-file', 'myFile.mat')
      Name       Size            Bytes  Class     Attributes
    
      x         20x20             3200  double              
      y         15x15             1800  double   

    但是,使用save保存的mat文件,默认使用的是v7版本,不支持部分加载。

    2、部分加载

    什么是部分加载?就是只加载变量的部分内容,对于大数据变量可以节省加载时间。

    目前只有v7.3版本支持,使用matfile可以创建v7.3的mat文件:

    %% 部分变量的保存与加载
    m = matfile('myFile2.mat'); % 新建时,默认Writable为true
    % 保存部分变量
    m.y(81:100,81:100) = magic(20);
    % 加载部分变量
    z = m.y(85:94, 85:94);
    % 确定变量大小
    [nrows, ncols] = size(m, 'y')

    如果后续想修改数据,可以

    %% 部分变量的修改
    m = matfile('myFile2.mat', 'Writable', true);
    % 或者
    % m = matfile('myFile2.mat');
    % m.Properties.Writable = true;
    
    m.y(1, :) = m.y(1, :)*2;

    对于非常大的文件,好的做法是一次将尽可能多的数据读取和写入到内存中,否则,重复的文件访问会严重影响性能。例如,假设文件包含许多行和列,并且加载一行就需要占用大量内存。这种情况下不要一次更新一个元素,而应该更新一行,如上。

    如果内存大小不是问题,那一次更新一个变量的全部内容也是可以的。

    3、动态加载部分变量

    如何动态地从 MAT 文件访问部分变量呢?在变量名未知时,此功能很有用。

    假设 MAT 文件示例 topography.mat 包含一个或多个具有未知名称的数组。构造一个 MatFile 对象,该对象对应于文件 topography.mat。调用 who 以获取文件中的变量名称(topography.mat是matlab提供了,可以直接使用)。

    exampleObject = matfile('topography.mat');
    varlist = who(exampleObject)

    结果

    >> varlist
    
    varlist =
    
      4×1 cell 数组
    
        {'topo'      }
        {'topolegend'}
        {'topomap1'  }
        {'topomap2'  }

    那么就可以如下访问变量

    for index = 3:4
        varName = varlist{index};
        S(1).(['elevationOf_',varName]) = exampleObject.(varName)(:,3);
    end

    结果

    >> S
    
    S = 
    
      包含以下字段的 struct:
    
        elevationOf_topomap1: [64×1 double]
        elevationOf_topomap2: [128×1 double]

    4、避免意外加载整个变量

    如果您不知道 MAT 文件中一个大型变量的大小,并且想要一次仅加载该变量的一部分,不要使用 end 关键字。使用 end 关键字会将相关变量的全部内容临时加载到内存中。对于非常大的变量,加载过程可能会花费较长时间,也可能会产生 Out of Memory 错误。在这种情况下,应对 MatFile 对象调用 size 方法。

    例如,以下代码会将 B 的完整内容临时加载到内存中:

    lastColB = exampleObject.B(:,end);

    改用以下代码可提高性能:

    [nrows,ncols] = size(exampleObject,'B');
    lastColB = exampleObject.B(:,ncols);

    类似地,任何时候使用 matObj.varName 形式的语法引用变量,例如 exampleObject.B,MATLAB都会临时将整个变量加载到内存中。因此,请使用以下语法调用 size 方法:

    [nrows,ncols] = size(exampleObject,'B');

    而不是

    [nrows,ncols] = size(exampleObject.B);

    5、预开辟空间

    当需要将大量数据写入 MAT 文件时,会存在不断开辟新空间的问题。为了尽可能减少文件增长的次数并确保最佳性能,可以在填充数据前初始化数组。

    fileName = 'matFileOfDoubles.mat';
    matObj = matfile(fileName);
    matObj.Properties.Writable = true;
    matObj.data(1, 1000000) = 0;

    这时,由于mat文件的数据压缩功能,matFileOfDoubles.mat很小。所以将一个初始值赋给数组的最后一个元素不会创建一个大文件,但它却可以为数据的不断增加做好准备。

    nout = 0;
    while(nout < 1000000)
        fprintf('Writing %d of %dn',nout,1000000);
        chunkSize = min(50000,1000000-nout);
        data = randn(1,chunkSize);
        matObj.data(1,(nout+1):(nout+chunkSize)) = data; % 填充数据
        nout = nout + chunkSize ;
    end

    6、保存 7.3 版本的 MAT 文件

    除了使用matfile创建7.3版本的mat文件,还可以

    save('data.mat', .., '-v7.3');

    如果想让save默认保存v7.3格式的mat文件,如下设置:

    1. 点击主页选项卡上的 预设
    2. 选择 MATLAB > 常规 > MAT 文件,勾选为第一个

    5d5e4660e58d3d1ab6cc4126c896f3cc.png

    Mat的版本

    a00a8117578851ee2a8c481d32b3f620.png

    7.3 版本的特点:

    • 7.3 版本的 MAT 文件使用基于 HDF5 的格式,该格式要求使用一些存储空间来描述文件内容。
    • 对于元胞数组、结构体数组或可以存储异构数据类型的其他容器,7.3 版本的 MAT 文件有时比版本 7 的 MAT 文件要大。

    7、关于数据压缩

    从 7 版本开始,当将数据写入到 MAT 文件时,MATLAB 会对数据进行压缩以节省存储空间数据压缩和解压缩会降低所有保存操作和部分加载操作的速度。在大多数情况下,降低文件大小所花费的额外时间是值得的。

    在某些情况下,加载压缩数据实际上可能比加载未压缩数据更快。例如,假设数值数组中的数据块分别保存为一个 10 MB 的压缩文件和一个 100 MB 的未压缩文件。加载每个文件的前 10 MB 花费的时间相同。但加载未压缩文件的剩余 90 MB 还要花费加载前 10 MB 的九倍时间,而压缩文件只需要相对较少的解压缩时间即可完成加载。

    在下列情况下数据压缩的好处可以忽略:

    • 相对于容器的复杂性,数据量不大。例如,压缩和解压缩简单数值数组比压缩和解压缩相同大小的元胞数组或结构体数组花费的时间更少。若数组产生的未压缩文件大小少于 3 MB, 则对数组进行压缩的好处非常有限,除非您要通过网络传输这些数据。
    • 数据是随机的,没有重复的模式或一致的值。

    8、问题解决

    基于以上matfile的用法,可以解决大数据存储的问题。

    按内容5讲的,先开辟一个大的空间

    matObj.data(1000, 1000000) = 0;

    然后依次存入数据

    for i = 1:1000
    	...
        matObj.data(i, :) = data; % 填充数据
    end

    但这种方式需要提前确定每次爬的数据的长度,而且随着数据的不断存储,会发现会越来越慢。原因可能出自数据压缩,matObj.data是一个变量,随着数据量的增大,数据压缩会越来越慢。

    为了保证存储效率,可以换一种方式:

    • 每次创建一个新变量保存数据;
    • 同时,维护一个list表,记录存入数据和变量名的对应关系,这个list变量只要在最后一次爬数据后存入mat即可

    1e5db4acc46aa96f9d2f9d3d013f1a1d.png

    这样,每次存储都不改变原有变量内容,只是在mat文件中不断添加新变量。经测试,按上面的方式第一次存储和最后一次存储的时间相差无几。而且这种方式更灵活,即使每次爬的数据长度不一样,也照样存储。

    展开全文
  • MATLAB_变量类型和函数

    2019-11-20 15:00:58
    目录数据类型数据类型标识数据类型的转换结构体struct 数据类型 1.数值类型 #double_双精度数组 #single_单精度数组 ...#table_具有命名变量的表数组(变量可包含不同类型的数据) 5.时间表 #tim...

    数据类型

    1.数值类型
    #double_双精度数组
    #single_单精度数组
    #int8_8位有符号整数数组
    #uint8_8位无符号整数数组
    2.字符和字符串
    #string_字符串数组
    3.日期和时间
    #datetime_表示时间点的数组
    4.表
    #table_具有命名变量的表数组(变量可包含不同类型的数据)
    5.时间表
    #timetable_具有时间戳行和不同变量类型的时间表数组
    6.结构体
    #struct_结构体数组
    ……

    数据类型标识

    iscalendarduration
    确定输入是否为日历持续时间数组
    iscategorical
    确定输入是否为分类数组
    iscell
    确定输入是否为元胞数组
    iscellstr
    确定输入是否为字符向量元胞数组
    ischar
    确定输入是否为字符数组
    isdatetime
    确定输入是否为日期时间数组
    isduration
    确定输入是否为持续时间数组
    isenum
    确定变量是否为枚举
    isfloat
    确定输入是否为浮点数组
    isgraphics
    对有效的图形对象句柄为 True
    isinteger
    确定输入是否为整数数组
    isjava
    确定输入是否为 Java 对象
    islogical
    确定输入是否为逻辑数组
    isnumeric
    确定输入是否为数值数组
    isobject
    确定输入是否为 MATLAB 对象
    isreal
    确定数组是否为实数数组
    isstring
    确定输入是否为字符串数组
    isstruct
    确定输入是否为结构体数组
    istable
    确定输入是否为表
    istimetable
    确定输入是否为时间表
    is*
    检测状态
    isa
    确定输入是否具有指定数据类型
    class
    对象的类
    validateattributes
    检查数组的有效性
    whos
    列出工作区中的变量及大小和类型

    数据类型的转换

    cast()
    B = cast(A,newclass) 将 A 转换为类 newclass,其中 newclass 是与 A 兼容的内置数据类型的名称。cast 函数截断 A 中太大而无法映射到 newclass 的任何值。B = cast(A,‘like’,p) 将 A 转换为与变量 p 相同的数据类型和稀疏性。如果 A 和 p 都为实数,则 B 也为实数。否则,B 为复数。
    #将 int8 值转换为 uint8。
    定义 8 位整数标量。

    a = int8(5);
    

    将 a 转换为 8 位无符号整数。

    b = cast(a,'uint8');
    class(b)
    ans = 
    'uint8'
    

    char
    字符数组
    cellstr
    转换为字符向量元胞数组
    int2str
    将整数转换为字符
    mat2str
    将矩阵转换为字符
    num2str
    将数字转换为字符数组
    str2double
    将字符串转换为双精度值
    str2num
    将字符数组或字符串转换为数值数组
    native2unicode
    将数值字节转换为 Unicode 字符表示形式
    unicode2native
    将 Unicode 字符表示形式转换为数值字节
    base2dec
    将以 N 为基数表示数字的文本转换为十进制数字
    bin2dec
    将用文本表示的二进制数字转换为十进制数字
    dec2base
    将十进制数字转换为以 N 为基数的数字的字符向量
    dec2bin
    将十进制数字转换为表示二进制数字的字符向量
    dec2hex
    将十进制数字转换为表示十六进制数字的字符向量
    hex2dec
    将十六进制数字的文本表示形式转换为十进制数字
    hex2num
    将 IEEE 十六进制字符串转换为双精度数字
    num2hex
    将单精度和双精度值转换成 IEEE 十六进制字符串
    table2array
    将表转换为同构数组
    table2cell
    将表转换为元胞数组
    table2struct
    将表转换为结构体数组
    array2table
    将同构数组转换为表
    cell2table
    将元胞数组转换为表
    struct2table
    将结构体数组转换为表
    cell2mat
    将元胞数组转换为基础数据类型的普通数组
    cell2struct
    将元胞数组转换为结构体数组
    mat2cell
    将数组转换为在元胞中包含子数组的元胞数组
    num2cell
    将数组转换为相同大小的元胞数组
    struct2cell
    将结构体转换为元胞数组

    结构体struct

    data.x = linspace(0,2*pi);
    data.y = sin(data.x);
    data.title = 'y = sin(x)'
    

    变量名称:data
    子变量(fields)名称:x; y; title【子变量可以是任何数据类型(包括结构变量)】

    data(1).x = linspace(0,2*pi);
    data(1).y = sin(data.x);
    data(1).title = 'y = sin(x)'
    
    data(2).x = linspace(0,3*pi);
    data(2).y = cos(data.x);
    data(2).title = 'y = cos(x)'
    

    (1)、(2):data不同编号中的内容

    元胞数组cell

    展开全文
  • matlab开发-多变量系统的时间和频率估计。该文件估计了AWGN信道下OFDM系统的载波频率偏移和定时偏移。
  • Matlab标题加变量

    2020-11-15 10:15:20
    变量有2种方式 title(sprintf("%d次拟合曲线", i)) title ( ['运行时间: ',num2str(i) ] ); 注意事项 title这句代码需要放在Plot()后面 示例 x=0:0.1:1; y=[-0.447 1.798 3.28 6.18 7.02 7.32 7.88 9.56 9.56 ...

    加变量有2种方式

    1. title(sprintf("%d次拟合曲线", i))
    2. title ( ['运行时间: ',num2str(i) ] );

    注意事项
    title这句代码需要放在Plot()后面

    示例

    x=0:0.1:1;
    y=[-0.447 1.798 3.28 6.18 7.02 7.32 7.88 9.56 9.56 9.30 11.2];
     
    figure('NumberTitle', 'off', 'Name', '比较多次多项式最小二乘拟合曲线');  %%自定义新窗口名称
    for i=1:4
    p=polyfit(x,y,i);
    xi=linspace(0,1,100);
    yi=polyval(p,xi);
     
    disp(i)
    subplot(2,2,i)
    plot(x,y,'o',xi,yi);
    title(sprintf("%d次多项式最小二乘拟合", i))
    end
    

    在这里插入图片描述

    展开全文
  • matlab开发-基于相关性的多变量系统动态时间扭曲。结合DTW和基于PCA的相似性度量。
  • 背景介绍:由于 MATLAB 自身的语法调整,关于 MATLAB 符号运算网上不少教程中的内容在 MATLAB 2019a 以及更高...看到的就省了再去网上海量搜索的时间了。本文使用 MATLAB 2020asyms 定义符号symbol是符号的意思。在...

    背景介绍:
    由于 MATLAB 自身的语法调整,关于 MATLAB 符号运算网上不少教程中的内容在 MATLAB 2019a 以及更高版本上要稍做改动才能调通。
    但往往去找教程的都是初学者,不知道怎么做这个“稍微的改动”。
    Sugar 下面就给出几个简单的例子,一学就会的那种。看到的就省了再去网上海量搜索的时间了。
    本文使用 MATLAB 2020a

    syms 定义符号

    symbol符号的意思。在 MATLAB 里定义符号变量的函数用这个单词的前三个字母来命名,即:sym()。使用方法如下图:

    da44b10e2280746053321b06bfca96ee.png

    sym() 函数定义符号变量要多敲好几下键盘,更简单的办法是用 syms 来定义变量,方法如下:

    87ee565732f65ba1abc951d6d1eef227.png

    符号表达式

    大多数时候对数学的理论研究是对符号表达式展开的,比如抛物线的三种形式:

    3008babbbac21a47131ae0f1a09f1024.png

    在《MATLAB 动画没有密秘》一文中绘制图像是通过把数据给各种函数来实现的。绘图可以直观地看出函数的图像,但没法研究上图中抛物线表达式的变化问题。因为同一个抛物线可以对应不同的表达式,反之不同的表达式产生的数据可能是同一个抛物线。

    当研究表达式变化的时候,就需要用到 MATLAB 的“符号表达式”,如下图:

    9f6679991d55b26f2726d806b41934ba.png

    注意:在 MATLAB 里的乘号不能省略。

    符号表达式的数值解

    eval() 函数用于:获得符号表达式的数值解。

    当使用 plot() 等函数来画图的时候需要的是数值,通过“符号表达式”来获取数值的函数是 eval() 函数。例如在上面的两点式抛物线表达式y=(x-1)*(x-3)中,我们可以在指定 x 的数值后用y=eval(y)来获得该符号表达式作用下相当的 y 值,如下图:

    3cec0db4643082ed841ca9caed7cae4a.png

    符号表达式的展开

    expand() 函数用于:将带括号的符号表达式展开成一般式。

    f7f42de8a331b594fa1e1efdcf051f08.png

    符号表达式的因式分解

    factor()函数用于:将一般式分解成带括号的各因式乘积的形式。

    6f9895784900b3ec674ec9e973f6b2d2.png

    方程的符号解

    solve()函数用于:求符号表达式对应方程的符号解。

    以一元二次方程的求解为例,如果忘记了求根公式,solve() 一下就想起来了,如下图:

    0a744b069fc7470799ae75cb34a4ebb2.png

    solve() 函数默认以 x 为自变量,可以显示指明其他符号变量为自变量,如下图:

    c283cb586ec15119f8cacb63e07e89ef.png

    PS

    MATLAB 的语法正在变得越来越方便,在数学表达式的写法上越来越靠近 Python、C 这样的编程语言。
    Python 的 SymPy 与 MATLAB 的符号运算功能一样,但 Sugar 还是推荐有 MATLAB 就用 MATLAB,因为与 Python 相比同样的功能按键次数更少,而且工作空间内随时可以查看变量值。

    关注作者

    欢迎扫码关注我的公众号MultiMCU EDUc5f37ec6f7079b2da62cdde623b2a671.png

    提示:在公众号“关于我”页面可加作者微信好友。

    喜欢本文求点赞,有打赏我会更有动力。

    展开全文
  • 每次用matlab跑上万条的数据,都要花费很长很长时间,昨晚 跑8万条数据、训练100次的CNN跑了两个半小时,今天继续执行2G的电脑内存不断溢出,删了几个后面用不到的大数据后还是溢出,于是决定用东哥的服务器来跑。...
  • Matlab 中 global 全局变量用法

    千次阅读 2020-03-18 08:42:58
    用法: 在主函数里面,你需要设置 a 这个变量是一个全局变量,就需要声明一下: global a; 然后在子函数里面你又...如果通过函数传参数的方式的话,系统会浪费过多的时间在复制数据的时间上,如果采用global的方...
  • matlab开发-通过变量索引的分形挥发性。varindx计算金融时间序列的变化指数和分形维数。
  • 在实时仿真过程中,需要实时获取到某段程序的运行时间,以便根据时间变化来调整对象的变化参数。 比如GPSR路由协议应用于车联网时,在模拟交通场景时需要实时根据程序运行时间和节点速度更改节点的位置信息。
  • Matlab S函数 global全局变量

    千次阅读 2012-07-07 21:56:37
    晚上一段时间纠结了一个nc的问题,有关matlab里S函数中的global全局变量的使用问题,刚开始我很怀疑它的意义何在,使用方法如下:  比如,我现在想在命令窗口中改变S函数里这样的全局变量,首先在S函数中相应位置...
  • t(转子运动方程——两个一阶非线性常微分方程): 已知切除故障时间(III段),求δ-t曲线判断系统稳定性 教材常用分段计算法和常微分方程数值解法——改进欧拉法,但是由于MATLAB进行常微分方程求解算法中没有改进...
  • matlab开发-脉冲响应变量描述分频器分频器。该函数计算离散时间传递函数到分数二阶低通滤波器。
  • matlab simulink自定义结构体变量并在函数模块中应用

    千次阅读 多人点赞 2019-05-15 21:34:58
    前段时间“硬着头皮”给一个simulink模型添加了一个函数模块,函数的输出是4个结构体变量,因此涉及到在simulink中自定义结构体类型的变量,以及显示输出的结构体变量。 完成这一任务的过程还是费了一些劲的,在...
  • %仿真时间值 ; margin-right:0pt">Ak=[0 0 1 0 1 0 1 0];               %产生8个基带信号 ; margin-right:0pt">Ak=2*Ak-1; ; margin-...
  • 许多朋友在用Matlab处理多个数据时常常疲于一个一个读取文件,读完之后还要自己新建变量存储,过于繁琐,浪费宝贵时间。遇到我,你就解放双手了!!! 自带弹框交互性好! 选择需要读取的文件 (按下ctrl点击多个...
  • 创建一个空数组:只要把一个方括号复制给一个变量就可以了。在MATLAB中,创建二维数组可以使用空格+分号的形式。每一行的各个元素使用空格隔开,换行时使用分号隔开。需要注意的是,每一行的元素个数需要相同,不...
  • 详细说明利用Matlab2015b编程实现读取NetCDF文件指定变量参数,并按年份导出Excle格式。
  • v=[ ];x=[ ];a=[ ]; f=[ ];g=[ ];b=[ ];w=[ ];u=[ ];...可以在matlab2013中这样编辑动态的数组变量吗?...The size of the indicated ...程序,以这种方式改变一个变量的大小可以花大部分运行时间在这种低效率的活动。
  • MATLAB title,xlabel,ylabel中引入变量

    千次阅读 2020-02-25 23:34:19
    1个变量: title ( ['运行时间: ',num2str(toc) ] ); ---------------------- 运行时间:2.334 title ( ['运行时间: ',num2str(toc),‘s’ ] ); ---------------------- 运行时间:2.334s 2个变量: title ( ['...
  • matlab学习笔记简介名称由来应用matlab基本特征数学运算运算符数学函数脚本文件 ... 时间序列分析(以时间推移来研究问题); 动态系统仿真(建模); 图像处理。 matlab基本特征 语法规则简单 脚本式(scr...
  • 在用稀疏矩阵进行计算时,通过消去零元素可以减少计算的时间。7.1 稀疏矩阵的存储方式对一般矩阵而言,MATLAB保存矩阵内的每一个元素,矩阵中的零元素与其他元素一样,需要占用同样大小的内存空间。但对于稀疏矩阵,...
  • MATLAB获取系统时间

    千次阅读 2019-04-13 11:34:54
    原文地址:在MATLAB中得到系统当前日期、时间也是经常用到的内容,由以下函数实现。... datestr-生成指定格式日期和时间,是字符型变量。 >> datestr(now) %其中now是获取当前日期和时间 ans =...
  • MATLAB常用日期和时间函数1.生成指定格式日期和时间datestr-生成指定格式日期和时间,是字符型变量。>>datestr(now)%其中now是获取当前日期和时间ans=30-Dec-200916:05:16其中输出格式可由用户指定,共有31种...
  • 最近用matlab编写程序时,这个错误让我郁闷了很长时间。明明写的是一个循环,第一个循环可以正常运转,而第二个循环则会报上述的错误; 而且单步调试运行也不会出错,只有整体运行便会报错;经过多遍仔细的检查,...
  • simulink的命令集 ...linmod 从连续时间系统中获取线性模型 linmod2 也是获取线性模型,采用高级方法 dinmod 从离散时间系统中获取线性模型 trim 为一个仿真系统寻找稳定的状态参数 构建模型命令 open...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 601
精华内容 240
关键字:

matlab时间变量

matlab 订阅