为Matlab表格预分配内存而不记账?

为Matlab表格预分配内存而不记账?,matlab,memory-management,Matlab,Memory Management,我已经从在structs中收集Matlab模拟的结果切换到在表中收集它们。我对这种表示数据的方式非常满意,但我仍然不确定如何处理内存预分配。如果我只是将行添加到表的底部,我会遇到在每次迭代中重新分配表中包含的所有变量的已知问题 我可以预先分配任意数量的行,并在脚本结束时修剪表。但如果我这样做,我必须保留实际包含数据的行数。在对表值进行任何操作时都必须考虑这个数字,这就消除了使用这个高级对象的美感 有没有一种方法可以预先分配Matlab表的内存,而不改变表的行为方式,并且不需要外部簿记 编辑-澄清

我已经从在structs中收集Matlab模拟的结果切换到在表中收集它们。我对这种表示数据的方式非常满意,但我仍然不确定如何处理内存预分配。如果我只是将行添加到表的底部,我会遇到在每次迭代中重新分配表中包含的所有变量的已知问题

我可以预先分配任意数量的行,并在脚本结束时修剪表。但如果我这样做,我必须保留实际包含数据的行数。在对表值进行任何操作时都必须考虑这个数字,这就消除了使用这个高级对象的美感

有没有一种方法可以预先分配Matlab表的内存,而不改变表的行为方式,并且不需要外部簿记

编辑-澄清


我的问题不仅涉及表格,而且涉及任何Matlab变量类。多年来,我一直在预先分配Matlab变量,令人沮丧的是,没有一个有效的线性函数可以在不进行额外管理的情况下附加数据。我希望至少table对象会包含一些更智能的内存管理解决方案。在我看来,为了避免重新分配而添加空行在科学代码中是没有位置的(应该尽可能抽象)。

您可以创建自己的自定义变量/表类来实现所需的功能,但老实说,使用您已经建议的解决方案工作要容易得多,即,只需使用一个额外的计数器变量来跟踪当前位置

我理解你对没有“更清洁”的方式感到沮丧,但事实上它并没有那么麻烦,任何潜在的“智能”解决方案都会对一些人有效,而对其他人则不会,无论是出于效率原因还是其他原因。另外,我猜在很多情况下,计数器已经内置到循环中:

A = zeros(2000, 1);
for i = 1:N
    A(i) = i^2;
    % i is the number of rows filled so far...
end

如果将所有变量分开,并且只在完成对数据的操作后创建表,是否会存在相同的问题?我仍然需要保留每个向量中“填充”项的数量,这不会减少麻烦。虽然您想要的是非常合理的,但似乎有点矛盾。如果你预先分配,我看不出你怎样才能避免跟踪已使用条目的数量。一种方法是预先分配
NaN
值,然后使用
nansum
nanmean
等函数忽略
NaN
。但是当然,这些函数通过使用一些内部预处理来忽略
NaN
(例如,
nansum
只是在求和之前将其置零)。因此,您仍然有某种动态的簿记功能,我希望预分配不会影响存储的数据。例如,考虑一个具有10行的表T。t=t。预分配行(1000)将预分配1000行所需的内存,但大小(t,1)将保持为10。