与提议的副本的区别:
首先,我想说我不是在谈论释放用于变量的物理内存,因此在这种情况下命令clear
,close
或pack
没有工作。在我的情况下,尽管在运行我的MATLAB脚本(不要太长时间)几次后使用它们,我的计算机的物理内存仍然耗尽。
我在具有8Gb RAM的Windows计算机中使用MATLAB R2016b。正如我之前所说,经过几次,我的计算机的物理内存开始耗尽,因此继续运行代码的唯一方法是重新启动程序(当我想运行脚本时,我不能这样做)。
clear all
clc
close all
%Datos entrada:
Long=60; %Longitud viga (m)
p_uni=1; %Carga repartida uniforme(kN/m)
n_division = 1000; %Numero divisiones de la viga
H = 3; %Componente horizontal en extremos
lon_barra=Long/n_division;
a = Long;
P_y = p_uni*lon_barra;
% Inicio programa:
if rem(n_division-1,2)==0 %Para el caso de numero par de fuerzas, que hace que el foco fin-comienzo de la representacion de fuerzas
y_force(1:((n_division-1)/2))=(((n_division-1)/2):-1:1)*P_y;
y_force(((n_division-1)/2)+1:n_division-1)=(1:1:(n_division-1)/2)*P_y;
else %Para el caso de numero impar de fuerzas,
y_force(n_division)=P_y/2;
y_force(1:n_division/2)=((n_division/2-0.5):-1:0.5)*P_y;
y_force(n_division/2+1:n_division)=(0.5:1:n_division/2)*P_y;
end
%Numero par de fuerzas sobre nodos internos
if rem(n_division-1,2)==0
N = ones(1,n_division-1);
alfa = ones(1,n_division-1);
for i=1:n_division-1
alfa(i) = atan(y_force(i)/H);
N(i) = y_force(i)/sin(alfa(i));
end
alfa_fin = zeros(1,n_division);
alfa_fin(1:length(alfa)/2)=alfa(1:length(alfa)/2);
alfa_fin(length(alfa)/2+2:end)=alfa(length(alfa)/2+1:end);
N_fin = ones(1,n_division);
N_fin(1:length(N)/2)=N(1:length(N)/2);
N_fin(length(N)/2+2:end)=N(length(N)/2+1:end);
N_fin(length(N)/2+1) = H;
for i=1:n_division+1
if i<=((n_division+1)/2)
if i==1;
y(i) = 0;
else
y(i) = tan(alfa_fin(i-1))*lon_barra+y(i-1);
end
else
y(i)=y(i-1)-tan(alfa_fin(i-1))*lon_barra;
end
end
%Numero impar de fuerzas sobre nodos internos
else
N = ones(1,n_division);
alfa = ones(1,n_division);
for i=1:n_division
alfa(i) = atan(y_force(i)/H);
N(i) = y_force(i)/sin(alfa(i));
end
y = ones(1,n_division+1);
for i=1:n_division+1
if i<=((n_division/2)+1)
if i==1;
y(i) = 0;
else
y(i) = tan(alfa(i-1))*lon_barra+y(i-1);
end
else
y(i)=y(i-1)-tan(alfa(i-1))*lon_barra;
end
end
end
%Densidad para altura objetivo:
q_final=H/lon_barra;
此图显示每次运行代码后所需的内存增加:
答案 0 :(得分:0)
我怀疑你会得到比这个主题MATLAB documentation中出现的更好的提示。我想指出的一个具体问题是:
长期使用(仅限Windows系统)
在32位Microsoft®Windows®上,由于Windows内存管理器不会向操作系统返回某些类型和大小的块,因此MATLAB的工作空间会随着时间的推移而碎片化。清除MATLAB工作区不能解决此问题。您可以通过先分配最大的变量来最小化问题。然而,这并不能解决工作区的最终碎片,例如,在数天和数周内连续使用MATLAB。唯一的解决方案是保存您的工作并重新启动MATLAB。
将所有变量保存到磁盘并将其加载回来的
pack
命令对这种情况没有帮助。
我知道它说“32位”,但我敢打赌这在某种程度上也适用于64位系统。
底线 - 您需要遵循文档的指导原则,特别注意预分配(在循环中增长y
)。
您可以做的另一件事是配置内存使用情况以查找内存泄漏。
在R2016b上可以使用的另一个选项是使用tall
arrays - 它们没有保存在RAM中。