精华内容
下载资源
问答
  • 首先,我要声明,matlab自带的Help才是最权威的Matlab学习资料,如果有时间好好学习一下或是可以高效的使用的话,一定受益匪浅!比如说像Out of Memory这个问题,最开始我都是用Help memory,几乎得不到任何信息;...
     
    

    http://www.zdh1909.com/html/matlab/11180.html

    首先,我要声明,matlab自带的Help才是最权威的Matlab学习资料,如果有时间好好学习一下或是可以高效的使用的话,一定受益匪浅!比如说像Out of Memory这个问题,最开始我都是用Help memory,几乎得不到任何信息;然后就是去网上搜索此类问题的解决方法,一般有这几种:

    除了升级内存和升级64位系统外,下面几个方法也是解决之道。


    1> 增加虚拟内存
    2> 采用PACK (在命令行输入 pack 整理内存空间)
    3> 采用3GB 开关启动系统(修改 c盘根目录 boot.ini 启动选项加上 /3G

    例如:

    multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect /3G
    4> 优化程序,减少变量
    (使用稀疏矩阵 sparse save 保存变量 load 变量,需要时再读出来
    5>
    如果必有必要,不要启动java虚拟机,采用matlab -nojvm启动
    (在快捷方式属性里面的 "..../matlab.exe"
    改为("...../matlab.exe" - nojvm
    6> 关闭Matlab Server  
    7> 使用
    单精度 single 短整数替代
    双精度。



    现在看来这些解决方法对于我的问题来说根本就是“治标不治本”,不能解决实际问题,后来在一个师兄的提醒下Help out of memory,终于找到了解决此类问题的方法。在此感谢这位师兄啊!

    重申――MatlabHelp才是Matlab的最权威的指导材料!!!

    其实我的所谓原创就是对Help out of memory的一些归纳总结而已,有兴趣的话大家可以自己去看!!!


    问题一:Matlab是如何存储矩阵的


    Matlab中矩阵是以Block,也就是块的形式存储的。也就是说,当Matlab在为即将存储的矩阵划分块时,如果没有相应大小的连续内存,即使实际内存没有被完全使用,他还是会报告Out of Memory”。


    问题二:如何高效使用Memory

    由于在使用的过程中,由于存储单元的不断的被分配和清除,内存会被分割成不连续的区域,这是很容易造成Out of Memory”。


    1为矩阵变量预制内存而不是动态分配
    在动态分配的过程中,由于开始Matlab所用的Block随着矩阵的增大而连续的为此矩阵分配内存,但是由于Block的不连续性,很有可能最开始分配的Block不能满足存储的需要,Matlab只好移动此Block以找到更大的Block来存储,这样在移动的过程中不但占用了大量的时间,而且很有可能它找不到更大的块,导致Out of Memory。而当你为矩阵变量预制内存时,Matlab会在计算开始前一次性找到最合适的Block,此时就不用为变量连续的分配内存。


    比较下面两个程序:
    for k = 2:1000

    x(k) = x(k-1) + 5;
    end


    x = zeros(1, 1000);
    for k = 2:1000

    x(k) = x(k-1) + 5;
    end




    显然,第二个更好!最好的方法是,在程序一开始就位所有大的矩阵变量预制存存储单元!

    Out of memory问题总结【原创】(二)



    1.尽量早的分配大的矩阵变量

    Matlab使用heap method管理内存。当在Matlab heap中没有足够的内存使用时,它会向系统请求内存。但是只要内存碎片可以存下当前的变量,Matlab会重新使用内存。
    比如:
    a = rand(1e6,1);
    b = rand(1e6,1);
    使用大约15.4 MB RAM

    c = rand(2.1e6,1);

      

    使用近似16.4 MB RAM:

    a = rand(1e6,1);
    b = rand(1e6,1);
    clear
    c = rand(2.1e6,1);



    使用32.4 MB RAM。因为Matlab不能使用abclear的空间,因为它们均小于2.1 MB而同时它们也很可能是不连续的。


    最好的方法:
    c = rand(2.1e6,1);
    clear
    a = rand(1e6,1);
    b = rand(1e6,1);
    使用16.4 MB RAM

    2尽量避免产生大的瞬时变量,当它们不用的时候应该及时clear

    3尽量的重复使用变量(跟不用的clear掉一个意思)

    4将矩阵转化成稀疏形式

    如果矩阵中有大量的0,最好存储成稀疏形式。稀疏形式的矩阵使用内存更少,执行时间更短。
    例如:
    1000
    ×1000的矩阵X,它2/3的元素为0,使用两种存储方法的比较:

    Name
    Size
    Bytes
    Class

    X
    1000x1000
    8000000
    double array

    Y
    1000x1000
    4004000
    double array (sparse)


    5使用pack命令

    当内存被分为很多碎片以后,其实本身可能有很大的空间,只是没有作构的连续空间即大的Block而已。如果此时Out of Memory,此时使用pack命令可以很好的解决此问题。


    6如果可行的话,将一个大的矩阵划分为几个小的矩阵,这样每一次使用的内存减少。


    7增大内存

    展开全文
  • Matlab预分配内存优化for循环

    万次阅读 多人点赞 2016-06-04 22:47:25
    Matlab中for循环在进行前没有预分配内存。重复扩展数组的尺寸,会花费更多的时间分配内存,导致程序性能降低。并且这些内存不一定是连续的,这更会减慢程序的操作。因此,我们可以采用预分配数组空间来解决这一...

    在Matlab中for循环在进行前没有预分配内存。重复扩展数组的尺寸,会花费更多的时间分配内存,导致程序性能降低。并且这些内存不一定是连续的,这更会减慢程序的操作。因此,我们可以采用预分配数组空间来解决这一问题。
    可以使用zeros和ones函数给数值型数组分配空间,使用cell函数给单元数组分配空间,使用struct给结构体分配空间。


    一个简单的例子:分别执行下面两段代码

    clear;clc;
    tic
    A(1) = 1;
    for i = 1 : 100000
        A(i + 1) = 5 * A(i);
    end
    toc

    clear;clc;
    tic
    A = zeros(1,100000);
    A(1) = 1;
    for i = 1 : 100000
        A(i + 1) = 5 * A(i);
    end
    toc

    两段代码唯一的区别就在于第二个中加入了预分配指令A = zeros(1,100000); 从结果可以看到代码运行时间大大缩短。


    参考资料


    第一次写BLOG,一定有遗漏和缺点,希望以后可以越来越好!

    展开全文
  • 这时,matlab需要分配给矩阵更多的内存。 如果在一个循环中,有矩阵不断变化着自己的维数,重新分配内存将十分耗时。 为了避免重复分配内存,可以先将内存分配好,再进行运算。 上面这段代码运行时间为0.47s....

    matlab矩阵变量有可变化的行数和列数。

    比如:


    matlab可以自动变化矩阵的维数。这时,matlab需要分配给矩阵更多的内存。

    如果在一个循环中,有矩阵不断变化着自己的维数,重新分配内存将十分耗时。

    为了避免重复分配内存,可以先将内存分配好,再进行运算。


    上面这段代码运行时间为0.47s.

    下面用zeros函数预先分配好内存,这样的代码为:


    这时,再运行这段代码,运行时间为:0.14s.

    预分配内存同样适用于cell数组, 用cell函数可以直接先创建所需大小的cell数组。

    展开全文
  • 感谢原文博主,因无法转载,所以直接...用 Matlab 进行大规模科学计算或仿真时,内存是一个需要时常注意的问题。在matlab里运行 >>system_dependent memstats 就可以看到内存的使用状况。当你写的 M...

    感谢原文博主,因无法转载,所以直接copy过来了:

    原文链接:https://blog.csdn.net/liuyue2046/article/details/8224198

    以下为正文:

    用 Matlab 进行大规模科学计算或仿真时,内存是一个需要时常注意的问题。在matlab里运行

    >>system_dependent memstats

    就可以看到内存的使用状况。当你写的 Matlab 程序跳出“Out of Memory” 时,以下几点措施是需要优先考虑的解决方法:

    1. 升级内存

    2. 升级64位系统

    3. 增加虚拟内存

    4. 采用3GB开关启动系统

    由于32位 Windows 操作系统的限制,每个进程只能使用最多 2GB 的虚拟内存地址空间,因此 Matlab 的可分配内存也受到相应的限制。Matlab 7.0.1 引进了新的内存管理机制,可以利用 Windows 的 3GB 开关,使用 3GB 开关启动的 Windows 每个进程可以在多分配 1 GB 的虚拟地址空间。具体做法是:修改C盘根目录 boot.ini 启动选项加上 /3G,例如:
    multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect /3G

    5. 如果必有必要,不要启动java虚拟机,采用matlab -nojvm启动 (在快捷方式属性里面的 "..../matlab.exe") 改为("...../matlab.exe" - nojvm)

    6. 关闭Matlab Server

    7. Windows中字体、窗口等都是要占用系统资源的,所以在Matlab运行时尽量不要打开不用的窗口。

    除此以外,更关键的是需要弄清楚以下几个问题:

    问题一:Matlab是如何存储矩阵的?
    Matlab中矩阵是以Block,也就是块的形式存储的。也就是说,当Matlab在为即将存储的矩阵划分块时,如果没有相应大小的连续内存,即使实际内存没有被完全使用,它还是会报告“Out of Memory”。

    问题二:如何高效使用Memory?
    Matlab 中数组必须占用连续分配的内存段,当无法为新建的数组分配连续的内存段的时候,”Out of Memory” 就会出现。在使用的过程中,由于存储单元的不断的被分配和清除,反复分配和释放数组会使内存被分割成不连续的区域,可用的连续内存段减少,很容易造成“Out of Memory”。因此当 Matlab 刚刚启动时其连续内存最多,此时往往可以新建非常大的数组,这一点可以用命令 feature(’memstats’)(在 7.0 版本以上)看出。如果现实的最大连续内存段很小,但实际可用内存(非连续的)仍旧很多,则表明内存中碎片太多了。此时可以考虑用 pack 命令,pack 命令的作用就是将所有内存中的数组写入硬盘,然后重新建立这些数组,以减少内存碎片。此外,在命令行或者程序中都可以使用 clear 命令,随时减少不必要的内存。

    因此,治本的方法如下:

    1. 在命令行输入 pack 整理内存空间

    当内存被分为很多碎片以后,其实本身可能有很大的空间,只是没有作构的连续空间即大的Block而已。如果此时Out of Memory,此时使用pack命令可以很好的解决此问题。

    2. 使用稀疏矩阵或将矩阵转化成稀疏形式 sparse

    如果矩阵中有大量的0,最好存储成稀疏形式。稀疏形式的矩阵使用内存更少,执行时间更短。例如:
    000×1000的矩阵X,它2/3的元素为0,使用两种存储方法的比较:

    Name
    Size
    Bytes
    Class

    X
    1000x1000
    8000000
    double array

    Y
    1000x1000
    4004000
    double array (sparse)

    3. 尽量避免产生大的瞬时变量,把没必要的变量clear掉或当它们不用的时候应该及时clear。

    4. 减少变量,尽量的重复使用变量(跟不用的clear掉一个意思)。

    5. 把有用的变量先save,后clear 掉,需要时再读出来。

    下面介绍一下关于clear、save、load的特殊用法,这对在for或while等多重循环里出现out of memory非常有效。

    for k = 1:N    % N为循环次数
    % ---------------------
        var0 = k; % 获得变量var0                        
    %----------------------
        string = [sprintf('var_%d', k) ' = var0;' ];
        eval_r(string);                                                          % 等价于 var_k = var0;
        save(sprintf('var_%d.mat', k), sprintf('var_%d')); % 等价于 save var_k.mat var_k
        clear(sprintf('var_%d'));                                        % 等价于 clear var_k
    end

    如果要读取刚才存取的变量var_k, (k = 1,2, ..., N). 那么,可以使用如下用法:

    for k = 1:N
           load(sprintf('var_%d.mat', k));     % 等价于 load var_k.mat    k = 1,2, ..., N
    end

    另外,还有一些非常有用的用法。如果用清除刚才读取的变量 var_k, k = 1, 2, ..., N

    clear '-regexp' '^var_'     % 清除所有以“ var_ ”开头的变量

    还有很多关于save、clear、load等用法,具体help一下。

    6. 使用单精度 single 短整数替代双精度 double

    Matlab 默认的数字类型是双精度浮点数 (double),每个双浮点数占用 8 个字节。对于一些整数操作来说,使用双浮点数显得很浪费。在 Matlab 中可以在预先分配数组时指定使用的数字类型如以下命令:zero(10, 10, ‘uint8′) 。对于浮点数,在很多精度要求不高的情况下,可以使用4个字节的单浮点数 (single),可以减少一半的内存。关于单、双浮点数的精度对照如下,以便根据需要选择使用:
    single: 精度 (1.1921e-007) 最大数 (3.4028e+038)
    double: 精度 (2.2204e-016) 最大数 (1.7977e+308)

    7. 为矩阵变量预制内存而不是动态分配

    在动态分配的过程中,由于开始Matlab所用的Block随着矩阵的增大而连续的为此矩阵分配内存,但是由于Block的不连续性,很有可能最开始分配的Block不能满足存储的需要,Matlab只好移动此Block以找到更大的Block来存储,这样在移动的过程中不但占用了大量的时间,而且很有可能它找不到更大的块,导致Out of Memory。而当你为矩阵变量预制内存时,Matlab会在计算开始前一次性找到最合适的Block,此时就不用为变量连续的分配内存。比较下面两个程序:

    for k = 2:1000
        x(k) = x(k-1) + 5;
    end

    x = zeros(1, 1000);
    for k = 2:1000
        x(k) = x(k-1) + 5;
    end

    显然,第二个更好!!!最好的方法是,在程序一开始就位所有大的矩阵变量预制存存储单元!!!

    8. 尽量早的为大的矩阵变量预制内存

    Matlab使用heap method管理内存。当在Matlab heap中没有足够的内存使用时,它会向系统请求内存。但是只要内存碎片可以存下当前的变量,Matlab会重新使用内存。比如:

    a = rand(1e6,1);
    b = rand(1e6,1);
    使用大约15.4 MB RAM

    c = rand(2.1e6,1);
    使用近似16.4 MB RAM

    a = rand(1e6,1);
    b = rand(1e6,1);
    clear
    c = rand(2.1e6,1);
    使用32.4 MB RAM

    Matlab不能使用a、b被clear的空间,因为它们均小于2.1 MB,而同时它们也很可能是不连续的。最好的方法:

    c = rand(2.1e6,1);
    clear
    a = rand(1e6,1);
    b = rand(1e6,1);
    使用16.4 MB RAM

    9. 如果可行的话,将一个大的矩阵划分为几个小的矩阵,这样每一次使用的内存减少。

    展开全文
  • 2.6.3内存优化 2.7经典案例 本章小结 第3章MATLAB绘图 3.1数据图像绘制简介 3.1.1离散数据可视化 3.1.2连续函数可视化 3.2二维绘图 3.2.1二维图形基本绘图命令plot 3.2.2二维图形的修饰 ...
  • Table of Contents 1. MATLAB 2. 矩阵计算——全0行整体替换 ...一方面友好的界面,直观的表示让很多用户为之倾倒,但另一方面又有很多人因为他的计算方式抱怨计算太慢,内存需求量大等。其实真的是MATLA...
  • 做模式识别实验遇到的一个问题:每次循环生成的向量维数都是随机的,如何把生成的向量最后合并成一个,用sum=[sum d]合并效率极低,原因在于matlab在循环中动态扩充数组会不断分配新的内存空间,并把原来的所有数据...
  •   用过Matlab的同学应该都知道,Matlab的慢是出了名的,但是再慢也有优化的方式,下面我们给出几个Matlab编程中常用的优化技巧。  在讲优化方法之前,首先要说的就是Matlab中用tic toc的方式来计算运行时间,这...
  • matlab代码优化方法

    2019-08-25 18:35:35
    2. 预分配内存 clear all clc n = 30000; tic; for k = 1:n a(k) = 1; end time = toc; disp(['未预分配内存下动态赋值长为',num2str(n),'的数组时间是:',num2str(time),'秒!']) tic b = zeros(1,n); for k...
  • Matlab运行速度优化

    2020-08-02 08:39:01
    2.在Matlab软件中设置,分配更多的运行内存 代码方面: 1.数据格式double转成single A_length = length(A); numbers = 50; for k = 1:numbers for i = 1:A_length for j = 1:A_length A(i,
  • 优化matlab运行速度的方案

    千次阅读 2019-09-02 20:07:25
    如果以后有可能在工作和...今天先总结十个优化matlab运行速度的方案,以后慢慢增加内容—— 1 提前分配内存 % 对于内存消耗非常大的情况 % 测试不提前分配val的内存 tic, for i=1:2000 for j=1:2000 val1=rand; ...
  • ”的作用是:指令执行结果不显示在屏幕上,但变量S将驻留在内存MATLAB默认常量 字符串 字符串作为字符数组用单引号(‘)引用到程序中,还可以通过字符串运算组成复杂的字符串。字符串数值和数字数值之间可以...
  • 本文主要讲述matlab程序运行的加速与优化。最近在做一些基于matlab的神经网络调参训练,需要尝试很多超参数的不同组合,所以在不同的机器上分别进行多种组合实验,加速算法验证。于是我发现,对于某些电脑加了内存条...
  • 通过优化内存存取提高代码性能By Stuart McGarrity大多数Matlab用户都希望他们的代码能够快速运行,尤其是处理很大数据集时。由于内存性能不像CPU性能一样提高,现在的代码经常受内存制约,整体性能受制于存取内存所...
  • Powell优化Matlab实现

    2021-01-10 00:36:40
    以下程序能够适应一维和多维的目标函数。 powell.m function [x,fval]=powell(f,x0,e,n) % Powell 函数f 初始点x0 精度e 未知数个数n X=zeros(n,n+2);... % 预分配内存,用于存放各点的函数下降量 x=x.
  • 为了提高最小二乘支持向量机的预测结果,文章用灰狼优化算法对其参数寻优,建立软件老化预测模型。通过实验证明了该模型,对软件老化的预测表现出很好的效果。 遗留在软件中的缺陷会随软件系统长期持续运行造成...
  • matlab BA无标度网络WS小世界网络优化算法,极大减少内存消耗
  • MathWorks 今日宣布,从MATLAB 和 Simulink 模型自动生成代码工具现已针对 ARM® Cortex® 处理器系列进行了优化。在汽车、航空、信号处理和医疗设备等行业使用 ARM Cortex 处理器的嵌入式系统开发人员现在可以自动...
  • 这个函数可以从UFLDL网站上下载,其好处是在用10000个样本优化30多万个参数时内存不溢出,比网站上所用的minFunc函数好。我下载后整理了一下,翻译了注释,行数从800多行压倒660行
  • matlab基础

    2019-04-06 10:35:51
    matlab代码发布成网页形式 %%之间要打一个空格,表示每一个模块的名称。 ... MATLAB内存优化配置 IV. 向量化编程 V. 图像对象和句柄 I. 清空环境变量及命令 clear all clc II. MATLAB...
  • 事件的顺序如下:在Python中定义变量,包括一个函数(fminconMaster_py),该函数使用2个以'x'作为参数的匿名函数(fun_py,obj_py)调用将fmincon算法用于优化问题的Matlab函数(optim_mat)-该优化问题具有在Matlab中...
  • 如何读取数据程序进行优化? 1、预先为变量分配内存; (1)原始程序如下: 程序通过fgetl()逐行读取数据,并对数据进行处理,代码如下: profile on filename = 'nav_data20180129000742-3.5Hr.txt'; %单位...
  • 为了提高最小二乘支持向量机的预测结果,文章用灰狼优化算法对其参数寻优,建立软件老化预测模型。通过实验证明了该模型,对软件老化的预测表现出很好的效果。 遗留在软件中的缺陷会随软件系统长期持续运行造成...
  • MATLAB入门

    2020-02-02 21:52:23
    matlab可以实现数值分析、优化、统计、微分方程数值解、信号处理、图像处理等若干领域的数值计算和图像显示,他将不同数学分支的算法以函数的形式分类成库,使用时直接调用函数并赋予实际参数就可以解决问题。...

空空如也

空空如也

1 2 3 4 5
收藏数 83
精华内容 33
关键字:

matlab优化内存

matlab 订阅