我如何使用MATLAB时预先分配内存?

243(30天)
我有几个循环的代码。我已经尝试使用包功能,但我继续得到“内存溢出”错误。

接受的答案

MathWorks支万博1manbetx持团队
之前如果还没有定义矩阵大小填充数据,通过一个FOR循环,内存碎片问题可能发生因为MATLAB不知道最后矩阵大小在FOR循环的结论。例如,看看下面的For循环:
i = 1:10
x (i) =我;
结束
当执行这个FOR循环,MATLAB看着i = 1,足够的内存请求从操作系统创建一个1 * 1矩阵,并创建x (1) = 1。当我= 2,MATLAB请求更多的内存可以存储1 x 2的矩阵。如果这额外的内存是在相同的连续内存带x(1) = 1时,MATLAB将添加额外的数量相同的内存地带。如果原始记忆带1 x1矩阵只是足够大,MATLAB移动x(1) = 1并把它放在一个足够大的内存位置1 x2矩阵。由于矩阵是1 x2,原来的内存插槽是无用的MATLAB对任何超过1 x1矩阵。现在这个记忆是支离破碎的,这将导致大FOR循环的重大问题。
为了解决这个问题,你应该预先分配内存通过创建一个初始矩阵的零的最终尺寸矩阵填充在FOR循环。例如,如果你创建一个大矩阵输入= 0 (1000),MATLAB将储备足够的连续空间内存1000 x1000矩阵a的大小。这种方式,而不是寻找一个新的块在内存中连续的空闲空间' a '每次增长大于块保存它,MATLAB将现在只有改变中的值矩阵a的预先分配内存空间。下面是一个例子如何预先分配内存之前进入一个FOR循环:
x = 0 (30);
我= 1:30,
j = 1:30
x (i, j) = i + j;
结束
结束
上面创建x 30 x30矩阵。这给了MATLAB足够大的内存块,所以它没有继续要求支离破碎的记忆。这种方法减少了接收“内存溢出”错误的机会由于碎片。它还能提高程序的性能,如以下代码所示:
运行下面的代码在内存不是预先分配:
抽搐;
我= 1:1000,
j = 1:1000,
x (i, j) = i + j;
结束
结束
toc
返回:
运行时间是12.175349秒。
另一方面,提前预分配的内存
抽搐;
x = 0 (1000);
我= 1:1000,
j = 1:1000,
x (i, j) = i + j;
结束
结束
toc
返回:
运行时间是1.761482秒。
预分配内存单元阵列,您可以使用以下命令:
c =细胞(m, n, p,)
它创建一个m-by-n-by-p -…单元阵列的空矩阵。参数m, n, p,…必须是标量。
应该注意的是,preallocating记忆没有意义,如果你不知道你的最终大小矩阵希望创建。这是因为两种情况下都有可能发生。预先分配内存要么太大,导致浪费内存;或分配的内存太小的矩阵您正试图创建,导致需要分配更多的内存和矩阵元素复制到新空间。后一种情况会让你一样容易受到你正试图避免内存碎片问题preallocating记忆。
4评论
wedad马吉德
wedad马吉德 2019年6月13日
亲爱的先生
我曾用里兹方法使用一个系列,当我没有使用。元素说23项特征值,需要一个小时给我我怎么能最小化呢?
谢谢你的帮助和时间
Dr.Widad Ibraheem马吉德

登录置评。

更多的答案(3)

大卫·曼纽尔Buitrago Montanez
编辑:大卫·曼纽尔Buitrago Montanez 2016年5月19日
你好,我是你的建议后,但警告仍然存在
y = 0 (d, 2);% preallocating
我= 1:娜戈
y =变长度输入宗量{};
如果长度(y) < d
% llenando洛杉矶向量de大马鲛直到特遣部队
c = 0 (d-length (y), 2);% dos de d大马鲛一列圆柱
y = [y; c];%的警告仍
结束
{我}= Y;% guarda celdas las矩阵
结束
谁能解释一下为什么?谢谢
哇!,我几乎忘了在这个脚本中提到有两个警告。第一个是:“变量”y“似乎是预先分配,但这里不建议预先配置”第二个是:“变量”y“似乎在每个循环迭代改变大小。考虑preallocating速度”,我说:[WHAAAAAT吗?]
3评论
沃尔特·罗伯森
沃尔特·罗伯森 2016年9月27日
的代码 给一个答案,如果你等待足够长的时间。但是你问调查60742943901的组合值,除以2 ^ 35组合,因此还需要相当一段时间。
你的问题不在于预先分配,问题是,你需要对代码进行向量化。

登录置评。


艾哈迈德·迪亚布
艾哈迈德·迪亚布 2019年4月3日
我怎么preallocate P和位置
1%的例子
N =输入(输入数的点负载。”);
数= 1:N
P(数)=输入(输入Magitude受力点的负载。”);
位置(数)=输入(输入点荷载的位置。”);

乌玛vellaisamy
乌玛vellaisamy 2021年4月29日
p (+ 1) = ((* * d * v /) ^(1 /(其它)));
错误显示变量p似乎变化大小在每个循环迭代(在脚本)。考虑prellocatting速度
如何创建它

MathWorks支万博1manbetx持

类别

找到更多的在性能和内存帮助中心文件交换

s manbetx 845

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!