我有一些通过引擎 C API 与 Matlab 通信的 C++ 代码。clear
我的代码在 Matlab 工作区中创建了临时变量,它会尽快通过调用对其进行清理。但是,在某些时候,我的应用程序失败了,告诉我它无法创建下一个 Matlab 临时变量(通常在 ~65530 次这样的操作之后)。
在对 Matlab 命令行进行了一些实验之后,我发现我可以在纯 Matlab 中重新创建这个问题(也就是说,独立于我的 C++ 代码及其对引擎 API 的使用)。考虑以下代码:
for i = 1 : 100000
eval(sprintf('x_%d = %d', i, i));
whos
eval(sprintf('clear x_%d', i));
whos
end
在我的 32 位 Windows 笔记本电脑上使用 Matlab R2008B(我知道很古老)执行此代码,循环最终中止并显示错误消息:
当前工作空间已经有太多变量;“x_65532”没有空间。
因此,似乎至少这个过时的 Matlab 版本有 64K 符号表的限制。也许对较新(64 位)版本的 Matlab 的限制更大——我很想听听其他人得到什么结果。
然而,更有趣的问题是clear
调用产生了什么影响以及如何解决其奇怪的行为。这是中止前一点迭代的输出:
x_65530 =
65530
Name Size Bytes Class Attributes
i 1x1 8 double
x_65530 1x1 8 double
Name Size Bytes Class Attributes
i 1x1 8 double
如您所见,whos
输出清楚地表明先前迭代的临时对象已从工作区中删除,并且 clear 似乎按预期工作。尽管如此,符号表显然已经达到了容量。
所以,对于如此忠实的人来说,有两个问题:
- 我该如何解决这个有点武断的限制?也就是说,我的
clear
电话应该用什么代替? - 更新和/或 64 位版本的 Matlab 是否改变了这种行为?