Cellfun与简单Matlab循环性能

Wer*_*ner 7 performance matlab

当我在大学的某个时候开始使用matlab时,如果他看到任何不必要的循环(他会要求交换它kron或尽可能的任何类型的索引操作),我的主管会杀了我.后来,我试图尽可能地避免在matlab上的任何循环,寻找最黑暗的matlab编码方式来做黑魔法而不是简单的循环.

有一天,我发现了cellfun,这使得黑魔法变得相当简单,我可以改变许多使用单元格和cellfun组合的循环,但有一天我看到一篇关于cellfun的帖子让我质疑我的遗传matlab知识是否真实,即:matlab循环总是比一个内置的编译函数慢,这是我非常有信心的东西.我在我的一个实现中测试了它,事实上,for循环会更快!我觉得,OMG,那些日子里做的模糊代码浪费了什么哈哈哈.从那天起,我就停止了努力尝试优化matlab代码,通常它取决于每个案例等等.

今天我看到了这个答案,它记得我尽量避免尽可能多的matlab循环(我不知道作者是否会为了性能而避免这种情况,但无论如何它提醒了所有这些matlab循环性能的事情).我想到了一个问题:cellfun比for循环好吗?什么时候会是真的?

gra*_*tnz 11

如果性能是一个主要因素,则应避免使用cell,loops或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);
Run Code Online (Sandbox Code Playgroud)