我正在编写机器学习代码,我很难找到使用矩阵操作进行某些操作的方法,而不是使用基本for循环的迭代方法。你认为使用迭代以外的矩阵会产生如此大的差异,还是可忽略的性能差异?
答案 0 :(得分:4)
matlab中的历史循环非常慢。但是,在具有新JIT编译循环的Matlab版本中可以非常快。
在Matlab中,它建议尽可能避免循环,因为语言作为一个整体是为基于矢量的操作而设计的。当编写matlab代码时,它被认为是错误的样式,而不是使用基于矢量的数学。
好的matlab代码:
[a b] = deal( rand(10,1) );
c = a+b;
糟糕的matlab代码:
[a b] = deal( rand(10,1) );
c = zero(10,1);
for i = 1:10
c(i) = a(i) + b(i);
这两个实现都是“正确的”,但99%的matlab程序员将使用第一个实现。此外,任何matlab程序员都会看到第一个实现,并确切地知道代码的含义。
关于性能,如果向量操作比循环更快,很难说出来,因为它实际上取决于实现细节。但是,根据我的经验,矢量函数很少比循环慢。我遇到过没有循环我无法解决的算法问题。当我发现基于矢量的解决方案时,它将计算时间从几分钟缩短到不到一秒钟:How can I optimize this indexing algorithm