MATLAB for循环索引的最佳实践

Dou*_*ubt 11 indexing performance matlab for-loop

我很惊讶地发现在运行MATLAB for循环之间存在以下差异成本:

ksize = 100;
klist = 1:ksize;

tic
for m = 1:100000        
    for k = 1:ksize

    end        
end
toc

tic
for m = 1:100000        
    for k = klist

    end        
end
toc
Run Code Online (Sandbox Code Playgroud)

唯一的区别是索引列表的创建方式.我怀疑第二个版本会更快,但是!

Elapsed time is 0.055400 seconds.
Elapsed time is 1.695904 seconds.
Run Code Online (Sandbox Code Playgroud)

我的问题有两个:对上述结果负责的是什么,以及在MATLAB编程中这种细微差别(或类似的)发生在哪里?我希望将来能够更好地发现这些低效率.谢谢大家.

Ole*_*leg 4

文档中for()指出:

for index = values
   ...
end
Run Code Online (Sandbox Code Playgroud)

其中values具有以下形式之一:

  • ...

  • valArray:在每次迭代时从数组的后续列创建列向量索引valArray。例如,在第一次迭代中,index = valArray(:,1). 循环执行的最大n次数,其中n是 valArray 的列数,由 给出numel(valArray, 1, :)。输入valArray可以是任何 MATLAB 数据类型,包括字符串、元胞数组或结构体。

因此,我假设存在很大的开销,并且编译器不会检查是否1:ksize == klist利用更快的实现。换句话说,根据 Eitan 的评论,JIT 适用于前两种类型的接受

整个问题与以下索引任务(列与元素)有关:

tic
for m = 1:100000        
    for k = 1:ksize
        klist(:,k);
    end        
end
toc

tic
for m = 1:100000        
    for k = 1:ksize
        klist(k);
    end        
end
toc

Index column:  ~2.9 sec
Index element: ~0.28 sec
Run Code Online (Sandbox Code Playgroud)

您可以看到如何klist(:,k)有效地减慢更快的循环,表明问题for k = klist与本例中使用的列索引有关。

有关更多详细信息,请参阅有关(低效)索引的冗长讨论