提升matlab性能方法

本文最后更新于 2023年9月22日。

在 Windows® 系统上,memory 函数可用于检查内存详细信息。要了解复制数组如何影响 Windows 系统的内存使用量,请在当前文件夹的一个文件中创建函数 memUsed。该函数调用 memory,以 MB 为单位返回您的 MATLAB 进程使用的内存量。

function y = memUsed
usr = memory;
y = usr.MemUsedMATLAB/1e6;
调用 `memUsed` 以显示当前内存使用量。
format shortG
memUsed
ans =
3966.1
创建一个 2000×2000 数值数组,并观察内存使用量的变化。该数组使用大约 32 MB 的内存。
A = magic(2000);
memUsed
ans =
3998.1

避免临时性的数据副本

避免创建不必要的临时性数据副本,以显著减少所需的内存量。

避免创建临时数组

避免创建大型临时变量,并在不再需要这些临时变量时清除它们。例如,以下代码创建由零组成的、存储为临时变量 A 的数组,然后将 A 转换为单精度:

A = zeros(1e6,1);
As = single(A);

使用一个命令来执行两个操作可更高效地使用内存:

A = zeros(1e6,1,'single');

使用 repmat 函数、数组预分配和 for 循环是处理非双精度数据而不需要内存中的临时存储的其他方法。

使用嵌套函数减少传递的参数

处理大型数据集时,注意 MATLAB 会创建输入变量的临时副本(如果被调用函数修改其值)。这会暂时使存储数组所需的内存翻倍,从而导致 MATLAB 在没有足够内存时生成错误。

在此情形下使用较少的内存的一种方法是使用嵌套函数。嵌套函数共享所有外部函数的工作区,为嵌套函数提供对其通常范围之外的数据的访问权。在如下示例中,嵌套函数 setrowval 可直接访问外部函数 myfun 的工作区,从而无需在函数调用中传递变量副本。当 setrowval 修改 A 的值时,它在调用函数的工作区中修改它。无需使用额外内存为所调用函数存储一个单独数组,且无需返回 A 的修改后的值:

function myfun
A = magic(500);
setrowval(400,0)
disp('The new value of A(399:401,1:10) is')
A(399:401,1:10)
function setrowval(row,value)
A(row,:) = value;
end
end

回收使用的内存

增加可用内存量的一种简单方法是清除您不再使用的大型数组。

定期将您的大型数据保存到磁盘

如果您的程序生成非常大量的数据,请考虑定期将数据写入磁盘。在保存该部分数据后,使用 clear 函数从内存中删除变量并继续生成数据。

从内存中清除不再需要的旧变量

当您重复或以交互方式处理非常大的数据集时,请首先清除旧变量以为新变量腾出空间。否则,MATLAB 需要等大小的临时存储才能覆盖此变量。例如,

a = rand(1e5);
b = rand(1e5);
Out of memory.
More information
clear a
a = rand(1e5);              % New array