gpt4 book ai didi

performance - Cellfun 与简单 Matlab 循环性能对比

转载 作者:太空宇宙 更新时间:2023-11-03 19:26:40 27 4
gpt4 key购买 nike

当我在大学前一段时间开始使用 matlab 时,如果我的主管看到任何不必要的 for 循环(他会要求将其交换为 kron 或任何类型的索引操作,他会杀了我可能的)。后来,我试图尽可能避免 matlab 上的任何循环,寻找最黑暗的 matlab 编码方式来执行黑魔法,而不是简单的循环。

有一天我发现了 cellfun,它使黑魔法变得非常简单,我可以改变许多使用单元格和 cellfun 组合的循环,但有一天我看到一post about cellfun这让我怀疑我继承的 matlab 知识是否正确,即:ma​​tlab 循环总是比一个内置编译函数慢,这是我非常相信的事情。我在我的一个实现中对其进行了测试,事实上,for 循环会更快!我当时想,天哪,那些日子里写晦涩难懂的代码白白浪费了哈哈哈。从那天起,我就不再那么努力地尝试优化 matlab 代码,通常这取决于每种情况等等。

今天我saw this answer ,这让我想起了我为尽可能多地避免 matlab 循环所做的努力(我不知道作者是否会为了性能而避免这种情况,但无论如何它提醒了所有这些 matlab 循环性能问题)。我想到一个问题:cellfun 比 for 循环好吗?什么时候会是这样?

最佳答案

如果性能是一个主要因素,您应该避免使用单元格、循环或 cellfun/arrayfun。使用矢量运算通常要快得多(假设这是可能的)。

下面的代码使用标准数组循环和数组操作扩展了 Werner 的添加示例。

结果是:

  • 细胞循环时间 - 0.1679
  • Cellfun 时间 - 2.9973
  • 循环阵列时间 - 0.0465
  • 阵列时间 - 0.0019

代码:

nTimes = 1000;
nValues = 1000;
myCell = repmat({0},1,nValues);
output = zeros(1,nValues);

% Basic operation
tic;
for k=1:nTimes
for m=1:nValues
output(m) = myCell{m} + 1;
end
end
cell_loop_timeAdd=toc;
fprintf(1,'Cell Loop Time %0.4f\n', cell_loop_timeAdd);

tic;
for k=1:nTimes
output = cellfun(@(in) in+1,myCell);
end
cellfun_timeAdd=toc;
fprintf(1,'Cellfun Time %0.4f\n', cellfun_timeAdd);


myData = repmat(0,1,nValues);
tic;
for k=1:nTimes
for m=1:nValues
output(m) = myData(m) + 1;
end
end
loop_timeAdd=toc;
fprintf(1,'Loop Array Time %0.4f\n', loop_timeAdd);

tic;
for k=1:nTimes
output = myData + 1;
end
array_timeAdd=toc;
fprintf(1,'Array Time %0.4f\n', array_timeAdd);

关于performance - Cellfun 与简单 Matlab 循环性能对比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18284027/

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