4

我有一些通过引擎 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 似乎按预期工作。尽管如此,符号表显然已经达到了容量。

所以,对于如此忠实的人来说,有两个问题:

  1. 我该如何解决这个有点武断的限制?也就是说,我的clear电话应该用什么代替?
  2. 更新和/或 64 位版本的 Matlab 是否改变了这种行为?
4

4 回答 4

2

以答案的形式重复我的评论:

如果你必须坚持变量命名,你可以尝试重新使用变量名,一旦它们被清除,避免创建 65xxx 不同的变量名。

于 2013-12-10T07:53:37.513 回答
2

2) 的答案是此限制适用于较旧的 Matlab 版本。虽然限制仍然存在于 中R2014b,但它不再存在于 中R2015b

于 2016-08-27T09:58:07.507 回答
1

关键是在matlab中你不应该需要那么多变量。使用更大的变量而不是许多变量。

如果每个x都是标量:使用向量

如果每个都x具有相同的大小:使用矩阵

如果每个x都不同,请使用元胞数组!

有了x{65530} = magic(3)您,您将不会接近极限。

于 2013-12-02T14:31:18.500 回答
0

我只是偶然发现了同样的事情。在 Python 中,我在 Matlab 实例中创建时间变量,这些变量稍后会被清除。为了确保我没有覆盖另一个时间变量,我使用 uuid() Python 模块为它们创建了新名称。这应该是个好主意。但是,过了一会儿,我遇到了一个异常,显示消息“当前工作区已经有太多变量”。执行 whos 我可以看到它们只是 8 个变量,所以我必须得出结论, clear 实际上并没有从工作区中删除变量。这真的很难理解,也真的很不方便。的确,我可以使用名称 temp001、temp002、temp003,但是当我需要一个新的时间变量时,我必须确保我当前没有使用该名称。Uuids 是为了避免这种问题而发明的,但似乎 Matlab 的尴尬行为阻止了我使用它们。有没有人找到一个很好的解决方案来真正从 Matlab 的工作区中删除变量?

于 2015-07-06T14:04:36.080 回答