精华内容
下载资源
问答
  • 首先,我要声明,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增大内存

    展开全文
  • 2.6.3内存优化 2.7经典案例 本章小结 第3章MATLAB绘图 3.1数据图像绘制简介 3.1.1离散数据可视化 3.1.2连续函数可视化 3.2二维绘图 3.2.1二维图形基本绘图命令plot 3.2.2二维图形的修饰 ...
  • matlab怎么增加内存

    2021-04-18 06:53:29
    matlab内存溢出的解决方案(整理)1)增加虚拟内存的方法是不可行的2)使用PACK:PACK可以将matlab中的变量导出到磁盘中,以增加可用内存3)减少变量的内存开销4)64位架构:采用64位的软硬件架构5)3GB 切换(3GB switch):...

    matlab怎么增加内存?在用MATLAB做图像处理时 经常会碰到内存溢出的情况,下面是学习啦小编收集整理的几种解决方法,希望对大家有帮助!

    matlab内存溢出的解决方案(整理)

    1)增加虚拟内存的方法是不可行的

    2)使用PACK:PACK可以将matlab中的变量导出到磁盘中,以增加可用内存

    3)减少变量的内存开销

    4)64位架构:采用64位的软硬件架构

    5)3GB 切换(3GB switch):由于在windows上运行matlab时,如果内存的使用超过约1.7G左右就要出现这种错误,而无论你有多大的内存也没用。幸好现在在Windows XP上,MATLAB现在支持3GB切换(3GB switch)启动选项(boot option),配置额外的1GB的可寻址内存到每个程序上。这增加了你可以储存到MATLAB workspace中资料的总量约到2.7 GB。这相当于33亿的精度值。此新增的内存区块和MATLAB使用剩下的(内存)并不是连续的,所以你不能建立一个数组来填满此空间。

    6)更有效的优化方案调整Java虚拟机可分配的内存大小

    matlab java.lang.OutOfMemoryError

    可以增加最大内存设置.

    1. 查找matlab根路径.在matlab命令行中敲入:matlabroot

    显示根路径,如:C:\MATLAB7

    2.查看当前Java虚拟机最大堆内存, 敲入:java.lang.Runtime.getRuntime.maxMemory

    3.查看Java虚拟机版本.敲入:version -java

    4.在 $MATLAB\bin\$ARCH 路径下新建java.opts文件.

    $MATLAB是根路径,例如C:\MATLAB7

    $ARCH是系统架构.例如win32,则在C:\MATLAB7\bin\win32下新建java.opts文件.

    5.用记事本打开java.opts文件,

    对于不同的版本的Java虚拟机,输入:

    The following table shows the default settings MATLAB uses for versions of the JVM:

    JVM Initial Heap Size Max Heap Size

    1.6.0 -Xms64m -Xmx128m (32-bit)

    -Xmx196m (64-bit)

    1.5.0 -Xms64m -Xmx96m (32-bit)

    -Xmx128m (64-bit)

    1.4.2 -Xms16m -Xmx96m

    1.3.1 -Xms16000000 -Xmx64000000

    1.2.2 -Xms16000000 -Xmx64000000

    1.1.8 -ms16000000 -mx64000000

    例如我的Java是1.4.2,在java.opts文件写入-Xmx96m,保存就ok啦

    如果输入错误就报错:warning : Failed to start to Java Virtual machine

    6. 重启matlab,敲入java.lang.Runtime.getRuntime.maxMemory

    显示最大内存改变,设置成功.

    展开全文
  • 我正在使用Matlab fminsearch来最小化带有两个变量的方程sum((interval-5).^2, 2)*factor间隔是一个包含5个值的向量。 只能从1到30的步长为1的顺序选择它们。因子是0.1到0.9的值。代码如下。 我认为区间值是正确的,...

    我正在使用Matlab fminsearch来最小化带有两个变量的方程sum((interval-5).^2, 2)*factor间隔是一个包含5个值的向量。 只能从1到30的步长为1的顺序选择它们。因子是0.1到0.9的值。

    代码如下。 我认为区间值是正确的,但因子值是错误的。

    间隔值:[3 4 5 6 7]因子值:0.6最终输出:6

    我认为因子值应为0.1,最终输出应为1作为全局最小值。

    %% initialization of problem parameters

    minval = 1;

    maxval = 30;

    step = 1;

    count = 5;

    minFactor = 0.1;

    maxFactor = 0.9;

    %% the objective function

    fun = @(interval, factor) sum((interval-5).^2, 2)*factor;

    %% a function that generates an interval from its initial value

    getinterval = @(start) floor(start) + (0:(count-1)) * step;

    getfactor =@(start2) floor(start2 * 10)/10;

    %% a modified objective function that handles constraints

    objective = @(start, start2) f(start, fun, getinterval, minval, maxval, getfactor, minFactor, maxFactor);

    %% finding the interval that minimizes the objective function

    start = [(minval+maxval)/2 (minFactor+maxFactor)/2];

    y = fminsearch(objective, start);

    bestvals = getinterval(y(1));

    bestfactor = getfactor(y(2));

    eval = fun(bestvals,bestfactor);

    disp(bestvals)

    disp(bestfactor)

    disp(eval)

    该代码使用以下函数f 。

    function y = f(start, fun, getinterval, minval, maxval, getfactor, minFactor, maxFactor)

    interval = getinterval(start(1));

    factor = getfactor(start(2));

    if (min(interval) < minval) || (max(interval) > maxval) || (factormaxFactor)

    y = Inf;

    else

    y = fun(interval, factor);

    end

    end

    我按照亚当的建议尝试了GA函数。 考虑到我的变量来自不同的范围和步骤,我将其更改为两个不同的集合。 这是我的零钱。

    step1 = 1;

    set1 = 1:step1:30;

    step2 = 0.1;

    set2 = 0.1:step2:0.9;

    % upper bound depends on how many integer used for mapping

    ub = zeros(1, nvar);

    ub(1) = length(set1);

    ub(2) = length(set2);

    然后,我改变了目标函数

    % objective function

    function y = f(x,set1, set2)

    % mapping

    xmap1 = set1(x(1));

    xmap2 = set2(x(2));

    y = (40 - xmap1)^xmap2;

    end

    运行代码后,我想我会得到想要的答案。

    展开全文
  • 熟悉了c语言的思维和c++显式的变量类型定义后,用matlab非常的不习惯,就算是用了很久依旧觉得不舒服。最近写一个通信系统仿真的代码(matlab),然后就遇到了恼火的问题。为了测试高信噪比条件下的误码率,必须要大量...

    熟悉了c语言的思维和c++显式的变量类型定义后,用matlab非常的不习惯,就算是用了很久依旧觉得不舒服。最近写一个通信系统仿真的代码(matlab),然后就遇到了恼火的问题。为了测试高信噪比条件下的误码率,必须要大量的仿真数据。比如估计的误码率在10^-4左右,那么仿真用的点数最少要有10^5个,还是保守估计,如果需要更高的性能仿真的话真的是无止境的大啊

    a4c26d1e5885305701be709a3d33442f.png

    然后悲剧的就出现了:“out of

    memory"!

    想办法解决吧,上网查资料:

    问题根源要从matlab那我认为并不严谨的变量使用和分配方式开始谈起。如果是c/c++的话我可以知道我的每一个变量的类型大小和分配在哪里,我总觉得可以控制的时候不容易出错,果然被林老师和邹老师洗脑了……

    但是matlab注重的是数值计算,为了方便工程人员使用,舍去了很多繁琐的语法和规定,后果就是感觉使用matlab像是在玩计算器……

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

    of Memory”。

    两种解决思路:

    1.

    提高程序运行时分配的内存

    1.1 由于32位 Windows 操作系统的限制,每个进程只能使用最多 2GB 的虚拟内存地址空间,因此 Matlab

    的可分配内存也受到相应的限制。Matlab 7.0.1 引进了新的内存管理机制,可以利用 Windows 的 3GB 开关,使用

    3GB 开关启动的 Windows 每个进程可以在多分配 1 GB 的虚拟地址空间。参考链接1

    1.2 增大虚拟内存

    Windows

    XP,右键“我的电脑”->属性->高级->性能->设置,从而改变其虚拟内存。

    1.3 如果必有必要,不要启动java虚拟机。如何做到的参考以上链接。

    1.4 关闭Matlab

    Server。

    2.

    matlab的源码优化以节省内存。

    我是个很消极的人,也就只能在这里揩点油水了……

    2.1 用pack命令,这个命令只可以在命令窗口中使用。

    2.2 为矩阵变量预制内存而不是动态分配。言之,所有变量先定义再用。好像动态分配很费内存的。

    2.3 尽量早的为大的矩阵变量预制内存,这样做的目的是先把内存中大的地方占到,防止分配了很多小的空间后没有足够大的空间存放大的矩阵变量。

    2.4 clear;没用的变量及时clear掉,即使有用的变量,也可以先save然后clear用的时候再load使用。这对在for或while等多重循环里出现out

    of memory非常有效。用法如链接1

    2.5 把大的矩阵分成很多小的矩阵。自己动动脑子不难实现。

    2.6 循环矢量化。少用for

    while循环,对矩阵的操作尤其是可以利用matlab优化的各种函数和矩阵操作,会使程序提速很多。比如直接对矩阵的第x行操作写成A(:,x),同理列操作。可以一个矩阵直接操作的话就别搞循环,看着晕还跑得慢。还有比如使用find等函数或如下写法

    M_full(M_full > 50) =

    0; % Set elements >50 to zero.

    2.7 尽量使用matlab给出的各种函数,那可是优化过的。

    2.8 能用稀疏矩阵的时候还是用吧。虽然我不怎么用这个。

    2.9 使用合适的数据类型。请help "Using

    Appropriate Data Storage"

    2.10 用function而不是script。

    2.11 用Mex文件编写循环代码。Matlab提供了与C和C++的接口,那么我们可以在用C或C++语言编写耗时的循环代码,然后通过接口程序在Matlab中转换成dll文件,这就是我们所要的Mex文件,通过这种方法可以极大地提高计算速率。

    2.12 遵守Performance

    Acceleration的规则。

    help

    Using Appropriate Data

    Storage

    Memory Usage

    out of memory

    参考:

    展开全文
  • 15.3.3 用MATLAB求解优化问题如表15-1所示,MATLAB软件有多种内建的函数可以完成***化求解。下面两个例子将说明它们是如何使用的。表15-1 实现***化的MATLAB函数函数描述fminbndfminsearch带有绑定约束的单变量函数...
  • 当然,这个自定义函数为非线性函数,调用MATLAB优化工具箱函数fmincon对其中的wt进行优化,wt中的各元素只要>0即可,没有其它约束。我的优化代码如下:wt=[1 1];%这里是自变量初始值LB=zeros(1,2);%这里是下边...
  • 这些函数用于创建出现在 2007 年 6 月的 News & Notes 上的文章“通过优化内存访问最大化代码性能”中显示的计时结果。 ...
  • 最近尝试采用matlab中的神经网络工具包做些...增加虚拟内存:在查看任务管理器发现物理内存为2GB,虚拟内存为共6GB,而观察matlab在运行过程中使用的内存没有超过2GB,因此不存在内存不足的问题。因此增加虚拟内存的...
  • MATLAB代码显示内存不足的解决方法

    千次阅读 2019-10-25 20:20:56
    总结了下大家对于运行MATLAB代码,显示内存不足的问题,在网上进行调研,总结如下: 一般out of memenry存在以下几种情况: 1、 变量需要的存储空间超过了可用的内存空间 2、 数据需要的存储空间,超过内存中最大的...
  • 如果你的系统是32位系统(进程最大支配2G空间,另外2G给系统进程了),在使用matlab 运行耗内存程序时候,会可能出现 out of memory 错误。这是因为matlab没有足够内存可以使用的缘故。解决的简单方法是加内存和升级为...
  • 最近尝试采用matlab中的神经网络工具包...增加虚拟内存:在查看任务管理器发现物理内存为2GB,虚拟内存为共6GB,而观察matlab在运行过程中使用的内存没有超过2GB,因此不存在内存不足的问题。因此增加虚拟内存的方法...
  • Fixed-Point Designer 中的查找表优化优化断点间距和表数据的数据类型,以减少查找表使用的内存。 • 使用此功能,您可以: o 优化现有的查找表模块。 o 从 Math Function 模块生成查找表。 o 从函数或函数句柄...
  • 使用matlab处理比较大的数据时候,我们会遇到out of memory 的情况,这种情况下就需要我们优化代码,来节省内存。我在处理一个超大矩阵的傅里叶变换过程中,测试了不同的代码及内存使用情况,这里和大家分享一下。...
  • MATLAB for循环优化三例

    2021-04-29 08:28:12
    最近一周,对MATLAB有进行了新一轮的学习,对其矩阵化编程的思维有了更深入的了解。确实精妙!例1:将矩阵A= [1 2 3; 2 4 3; 3 4 5]中所有的数字3替换为33.如果还停留在C语言的思维可能就是>> for i=1:3for j=...
  • 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,
  • 常用方法总结:1)使用PACK:PACK可以将matlab中的变量导出到磁盘中,以增加可用内存。2)减少变量的内存开销。注意:增加虚拟内存的方法是不可行的。3)64位架构:采用64位的软硬件架构。4)3GB 切换(3GB switch):由于...
  • FMINLBFGS 是一种内存高效的优化器,用于解决具有大量未知数的图像配准和 CPU 昂贵的梯度等问题。 支持的: - 准牛顿布罗伊登-弗莱彻-戈德法布-香诺 (BFGS)。 - 有限内存 BFGS (L-BFGS)。 - 最陡峭的梯度下降优化。...
  • MATLAB需要寻找需要大量时间的内存 循环矢量化 由于预先分配,最好避免循环。 大多数MATLAB函数可以将向量作为输入 密集和稀疏矩阵 稀疏矩阵是具有少量非零元素的矩阵。 用户可以创建稀疏矩阵以减小大小并提高效率。...
  • MATLAB中代码优化的两种方法

    千次阅读 2020-05-28 16:26:27
    MATLAB中的代码优化 MATLAB中的代码优化有两种重要的方法:预分配组和向量化循环。 我们举一个简单的例子来看,创建一个MATLAB函数来计算f(x) = sin(x / 100π): function y = sinfun1(M) x = 0: M - 1; for k = 1:...
  • 感谢原文博主,因无法转载,所以直接...用 Matlab 进行大规模科学计算或仿真时,内存是一个需要时常注意的问题。在matlab里运行 &gt;&gt;system_dependent memstats 就可以看到内存的使用状况。当你写的 M...
  • Matlab预分配内存优化for循环

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

    千次阅读 2019-09-02 20:07:25
    如果以后有可能在工作和...今天先总结十个优化matlab运行速度的方案,以后慢慢增加内容—— 1 提前分配内存 % 对于内存消耗非常大的情况 % 测试不提前分配val的内存 tic, for i=1:2000 for j=1:2000 val1=rand; ...
  • MATLAB内存溢出的解决办法

    千次阅读 2014-11-17 19:44:07
    ??? Out of memory. Type HELP MEMORY for your options. 在Matlab
  • quit:退出MATLAB,并返回所有分配的内存到系统中。 怎么高效使用内存 压缩内存的使用 1.仅导入需要的文件大小 2.以块为单位处理数据 3.避免建立较大的临时数组 4.使用嵌套函数来传递数据 使用适当的数据存储方式 ...
  • 有限内存BFGS(Broyden–Fletcher–Goldfarb–Shanno)算法的Matlab代码。 有限内存BFGS(L-BFGS)是准牛顿方法家族中的一种优化算法,它使用有限的计算机内存来近似Broyden-Fletcher-Goldfarb-Shanno(BFGS)算法。...
  • 这时,matlab需要分配给矩阵更多的内存。 如果在一个循环中,有矩阵不断变化着自己的维数,重新分配内存将十分耗时。 为了避免重复分配内存,可以先将内存分配好,再进行运算。 上面这段代码运行时间为0.47s....
  • 新手求教MATLAB中遗传算法的指导论文需要急求-单交叉口交通多目标控制方法.pdf 我的论文跟附件中的文章类似,但编程不大懂,希望各位大神帮忙看看指导一下
  • 加速Matlab编程指南—持续更新加速Matlab编程指南(CUDA实现) 本教程适用于具有一定Matlab编程基础的读者。说是教程,更像是读书笔记,文中出现的内容多是笔者阅读以下资料的归纳和整理。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,476
精华内容 3,790
关键字:

matlab优化内存

matlab 订阅