gpt4 book ai didi

matlab - 使用 Statistics Toolbox 进行数据集数组索引非常慢

转载 作者:行者123 更新时间:2023-12-04 06:20:05 24 4
gpt4 key购买 nike

为什么索引到数据集数组这么慢? dataset.subsref 函数的峰值显示数据集的所有列都存储在一个元胞数组中。但是,单元格索引比数据集索引快得多,数据集索引只是在幕后索引到单元格数组。我的猜测是这与 MATLAB OOP 的一些开销有关。关于如何加快速度的任何想法?

%% Using R2011a, PCWIN64
feature accel off; % turn off JIT

dat = (1:1e6)';
dat2 = repmat({'abc'}, 1e6, 1);
celldat = {dat dat2};
ds = dataset(dat, dat2);
N = 1e2;

tic;
for j = 1:N
tmp = celldat{2};
end
toc;

tic;
for j = 1:N
tmp2 = ds.dat2; % 2.778sec spent on line 262 of dataset.subsref
end
toc;

feature accel on; % turn JIT back on

Elapsed time is 0.000165 seconds.
Elapsed time is 2.778995 seconds.

编辑:我已经更新了示例,使其更像我所看到的问题。大量时间花费在 dataset.subsref 的第 262 行 - "b = a.data{varIndex};"。这对我来说很奇怪,因为它是一个简单的单元格取消引用。我想知道是否有一个 OOP 技巧可以让我在没有奇怪开销的情况下索引到“a.data”。

编辑2:根据安德鲁的建议,我已将此作为错误提交给 MatWorks。如果我听到他们的任何消息,我会更新。

EDIT3: Matlab 回应并表示他们现在已经意识到这个问题,并将在 future 的版本中修复它。他们指出这个问题是特定于单元阵列的,如果可能的话尽量避免它们。

最佳答案

是的,您很可能会看到 Matlab OOP 方法调用的开销。与单元格索引或某些其他语言的方法调用相比,它们的成本很高。您每次调用 0.513872 秒/1e4 ~= 51 微秒,这是几次 MCOS 方法调用的近似成本;在我见过的机器上,它们每个大约是 5-15 微秒。所以这看起来像是 subsref() 调用本身的方法开销以及它依次调用的其他方法和属性访问。

有关详细信息和讨论,请参阅:Is MATLAB OOP slow or am I doing something wrong?

除了构建代码以最小化对“ds.dat”或其他方法的调用之外,我不知道有什么方法可以加快速度。如果可能,在处理数据集时,调用一次“ds.dat”,将其保存在局部变量中并在那里处理,然后将其推回 ds 对象。

警告:我不知道“功能加速”的作用或它如何影响这些时间。

编辑:我像 Richie 建议的那样把它扔进了分析器中。在我的 R2009b 上,看起来大约一半时间是方法调用开销,其余时间在 find()、strcmp() 和 subsref 中的其他操作中; subsref 不会依次调用任何其他方法。

编辑 2:修改后的示例显示了更高的时间。方法调用开销并不能说明所有这些。

关于matlab - 使用 Statistics Toolbox 进行数据集数组索引非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6697951/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com