[已答复] 使用str2func导致内存不够的问题

[复制链接]
alexxx 发表于 2022-11-23 03:32:40
我有1089个函数,构成一个33x33的矩阵,它们存放在硬盘上,其中一个如附件所示。我希望通过一个函数funAB(q)求解这个矩阵的具体值。当我循环调用funAB(q)时,发生了out of memory的错误。我的计算机有32G物理内存。请问大佬们,出现这种情况,是由于matlab多次打开文件导致的吗?但我无法通过fclose来释放句柄。


function AB_33_33 = funAB(q)
FunName =  'subFunAB_Tri_ABC_M1Y_rec_floBas_';
for kH = 1:33
    for kL = 1:33
        subFunNameStr = strcat(FunName,num2str(kH),'_',num2str(kL));
        subFunName = str2func(subFunNameStr);
        AB_33_33(kH,kL) = subFunName(q);   
    end
end
end

Snipaste_2022-11-23_03-21-47.jpg

subFunAB_Tri_ABC_M1Y_rec_floBas_4_6.m

695.34 KB, 下载次数: 4

5 条回复


1119093102 发表于 2022-11-23 14:53:45
delete就可以删除句柄,但可能是某个函数计算过程有一个很大的值,查一下

alexxx 发表于 2022-11-23 15:10:21
1119093102 发表于 2022-11-23 14:53
delete就可以删除句柄,但可能是某个函数计算过程有一个很大的值,查一下

delete subFunName后提示  :警告: 未找到文件 'subFunName'。
我尝试将1089个函数中占硬盘最大的一个放在最前面计算,以期望获得预先分配的内存。但这样做并没有改善我的问题。
或许pack是一种有效的手段,但pack只能在MATLAB 命令行使用.

1119093102 发表于 2022-11-23 15:22:37
alexxx 发表于 2022-11-23 15:10
delete subFunName后提示  :警告: 未找到文件 'subFunName'。
我尝试将1089个函数中占硬盘最大的一个放 ...

delete只能删除对象,应该针对不了函数句柄。。。。,感觉不是这个问题。用这里面的方法查一下,内存之类的情况探查性能

TouAkira 发表于 2022-11-25 03:28:14
你所发的函数的计算式,实在是过于冗长了,我大致查了下,有好几个输入会被调用九千多次。
我个人不是很理解,目标如果是进行浮点数值计算,是否有必要,使用如此长的表达式。
按我的理解,以有限项级数对原函数做近似,是没有必要使用近万项的。甚至,使用过高项数的级数做近似,反而会产生在某些区间误差显著增大的龙格现象(Runge's phenomenon,类似傅里叶级数逼近中的吉布斯现象(Gibbs phenomenon))。
建议去咨询咨询数学或计算机方向的老师,请他们帮你分析一下如何对原函数做有效近似。

小磁石 发表于 2022-11-25 19:13:13
本帖最后由 小磁石 于 2022-11-25 19:14 编辑

我觉的4楼说的很对,本身函数调用又不会把局域变量搞成全局变量。你可以提高java堆内存的同时,试着把表达式打断,就是基本的加减乘除,没必要非要放到一个表达式里同时计算,分成好多段求值,然后再加减
您需要登录后才可以回帖 登录 | 注册

本版积分规则

相关帖子
相关文章
热门教程
站长推荐
快速回复 返回顶部 返回列表