Matlab变量计数限制

时间:2013-12-02 12:18:00

标签: matlab limits symbol-table

我有一些C ++代码通过Engine C API与Matlab通信。我的代码在Matlab工作区中创建临时变量,它会尽快通过clear调用来清理。但是,在某些时候,我的应用程序失败了,告诉我它无法创建下一个Matlab临时变量(通常在~65530这样的操作之后)。

在Matlab命令行上进行一些实验后,我发现我可以在纯Matlab中重新创建这个问题(也就是说,独立于我的C ++代码及其对Engine API的使用)。请考虑以下代码:

for i = 1 : 100000
  eval(sprintf('x_%d = %d', i, i));
  whos
  eval(sprintf('clear x_%d', i));
  whos
end

使用Matlab R2008B在我的32位Windows笔记本电脑上执行此代码(古老,我知道),循环最终会中止并显示错误消息:

  

当前工作空间已经包含太多变量;没有空间   为“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输出清楚地显示了先前迭代中的临时值已从工作空间中删除,并且清晰似乎按预期工作。尽管如此,符号表显然达到了容量。

所以,SO忠实的两个问题:

  1. 我如何解决这个有点任意的限制?也就是说,我的clear来电应该被替换为什么?
  2. 使用较新的和/或64位版本的Matlab会改变此行为吗?

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

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

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

如果每个x不同,请使用单元格阵列!

使用x{65530} = magic(3),您将无法接近极限。

答案 3 :(得分:0)

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