我应该在MATLAB中使用哪个:max(A(:))或max(max(A))?

时间:2015-01-13 23:26:43

标签: performance matlab max

对于支持max(A(:))的小矩阵,我得到了相当一致的时差:

>> A=rand(100); tic; max(A(:)); toc; tic; max(max(A)); toc;
Elapsed time is 0.000060 seconds.
Elapsed time is 0.000083 seconds.

但对于大型矩阵,时差不一致:

>> A=rand(1e3); tic; max(A(:)); toc; tic; max(max(A)); toc;
Elapsed time is 0.001072 seconds.
Elapsed time is 0.001103 seconds.
>> A=rand(1e3); tic; max(A(:)); toc; tic; max(max(A)); toc;
Elapsed time is 0.000847 seconds.
Elapsed time is 0.000792 seconds.

相同的更大,

>> A = rand(1e4); tic; max(A(:)); toc; tic; max(max(A)); toc;
Elapsed time is 0.049073 seconds.
Elapsed time is 0.050206 seconds.
>> A = rand(1e4); tic; max(A(:)); toc; tic; max(max(A)); toc;
Elapsed time is 0.072577 seconds.
Elapsed time is 0.060357 seconds.

为什么会出现差异,最佳做法是什么?

2 个答案:

答案 0 :(得分:3)

正如horchler所说,这取决于机器。但是,在我的机器上,我看到max(max(max(...的更高尺寸的性能明显下降。我还看到max(A(:))对于更加有序的类型o矩阵作为toeplitz矩阵的速度有轻微(但一致)的优势。不过,对于你尝试过的测试用例,我几乎没有看到任何差异。

同样max(max(max(...由于我更喜欢​​max(A(:))所有的paranthesis而容易出错。这个函数的执行时间似乎对所有维度都是稳定的,这意味着很容易知道这个函数执行的时间。

第三:函数max似乎非常快,这意味着性能应该是一个小问题。这意味着在这种情况下max(A(:))会因其可读性而受到欢迎。

所以作为结论,我更喜欢max(A(:)),但如果你认为max(max(A))更清楚,你可以使用它。

答案 1 :(得分:2)

在我的机器上,没有时间差异,真的值得担心。

n = 2:0.2:4;
for i = 1:numel(n)
    a = rand(floor(10^n(i)));
    t1(i) = timeit(@()max(a(:)));
    t2(i) = timeit(@()max(max(a)));
end

>> t1
t1 =
  Columns 1 through 7
   7.4706e-06   1.5349e-05   3.1569e-05    2.803e-05   5.6141e-05   0.00041006    0.0011328
  Columns 8 through 11
    0.0027755     0.006876       0.0171     0.042889
>> t2
t2 =
  Columns 1 through 7
   1.1959e-05   2.2539e-05   2.3641e-05   4.1313e-05   7.6301e-05   0.00040654    0.0011396
  Columns 8 through 11
    0.0027885    0.0068966      0.01718     0.042997