Matlab 具有多个变量的循环的预分配

Matlab 具有多个变量的循环的预分配,matlab,Matlab,我正在运行一个循环,该循环从表中的单元格获取数据并将它们添加到结构中。下面就是它的样子: TotalLowResfields = fieldnames(TotalLowRes); for t = 10:numel(TotalLowResfields) rows = {TotalLowRes.c}; cols = [TotalLowRes.y] - 10 + t; subtable = Raw(rows, cols); values = table2cell(

我正在运行一个循环,该循环从表中的单元格获取数据并将它们添加到结构中。下面就是它的样子:

TotalLowResfields = fieldnames(TotalLowRes);

for t = 10:numel(TotalLowResfields)

    rows = {TotalLowRes.c};
    cols = [TotalLowRes.y] - 10 + t;
    subtable = Raw(rows, cols);

    values = table2cell(subtable);
    values = values(logical(eye(numel(rows))));

    [TotalLowRes.(TotalLowResfields{t})] = deal(values{:});
end
通过这个循环大约需要7分钟,我想预先分配以提高速度

我尝试了预分配:

subtable = zeros(1828,1828);
values = zeros(1828,1);
这没有多大帮助。预分配前花了404秒,分配后花了403秒。 我正在使用的结构数组,
totalowres
,其中有1828个结构,有29个字段,因此它通过1828个结构中的19个字段=34732个条目。但是如果可能的话,我如何预先分配结构呢

编辑:我运行了探查器,它显示了以下内容:

Function Name                 Calls   Total Time   Self Time
able2cell                     19        362.585 s    1.838 s  
mat2cell                      34732     360.747 s    360.747 s
table.subsrefParens           19        66.066 s     0.720 s
table.subsref                 19        66.066 s     0.000 s 
makeUniqueStrings             38        64.887 s     0.003 s 
makeUniqueStrings>makeUnique  38        64.258 s     63.960 s

似乎函数
mat2cell
makeUniqueStrings>makeUnique
是最昂贵的函数。有没有办法减少他们的计算时间?

(1)我会先试试分析器,看看是什么花了这么长时间<代码>配置文件打开然后运行代码,然后
配置文件关闭
最后是
配置文件查看器
(2)我喜欢表格,但为了高性能,一些对表格的调用并不快…@MatthewGunn谢谢你的提示!我在问题中添加了个人资料,根据个人资料分析结果,我猜您使用的是非常大的表格?表有多大?您实际索引了多少行/列?也许您可以改进您的代码示例,使用一些大小合适的随机数据初始化变量。@Daniel
子表
表似乎是1828 x 1828=3341584。这可能被认为是巨大的。我在循环之前预先分配了
subtable=zero(18281828)
,但它似乎没有改变任何东西。@ArthurTarasov:Preallocation在这里没有帮助。时间花费在函数调用
table2cell
中,该函数出于某种原因多次调用
mat2cell
。如果预分配是一个问题,那么对于您的功能来说,您将是一个巨大的“自我时间”。