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
。如果预分配是一个问题,那么对于您的功能来说,您将是一个巨大的“自我时间”。