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编程中这种细微差别(或类似的)发生在哪里?我希望将来能够更好地发现这些低效率.谢谢大家.
文档中for()指出:
Run Code Online (Sandbox Code Playgroud)for index = values ... end其中
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与本例中使用的列索引有关。
有关更多详细信息,请参阅有关(低效)索引的冗长讨论。