我应该在 MATLAB 中使用哪个:max(A(:)) 或 max(max(A))?
Which should I use in MATLAB: max(A(:)) or max(max(A))?
我得到了一个非常一致的小矩阵时间差,有利于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.
为什么会有差异,最佳做法是什么?
正如所说,这取决于机器。但是,在我的机器上,我看到 max(max(max(...
对于更高维度的性能明显下降。我还看到 max(A(:))
在速度上有轻微(但一致)的优势,因为 toeplitz
矩阵的排序类型 o 矩阵更多。不过,对于您尝试过的测试用例,我几乎看不出有什么不同。
另外 max(max(max(...
由于所有的括号而容易出错,我更喜欢 max(A(:))
。这个函数的执行时间似乎对所有维度都是稳定的,这意味着很容易知道这个函数执行需要多少时间。
第三:函数max
似乎非常快,这意味着性能应该是这里的一个小问题。这意味着在这种情况下 max(A(:))
因其可读性而成为首选。
所以作为结论,我更喜欢 max(A(:))
,但如果您认为 max(max(A))
更清楚,您可能会使用它。
在我的机器上没有真正值得担心的时间差异。
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
我得到了一个非常一致的小矩阵时间差,有利于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.
为什么会有差异,最佳做法是什么?
正如max(max(max(...
对于更高维度的性能明显下降。我还看到 max(A(:))
在速度上有轻微(但一致)的优势,因为 toeplitz
矩阵的排序类型 o 矩阵更多。不过,对于您尝试过的测试用例,我几乎看不出有什么不同。
另外 max(max(max(...
由于所有的括号而容易出错,我更喜欢 max(A(:))
。这个函数的执行时间似乎对所有维度都是稳定的,这意味着很容易知道这个函数执行需要多少时间。
第三:函数max
似乎非常快,这意味着性能应该是这里的一个小问题。这意味着在这种情况下 max(A(:))
因其可读性而成为首选。
所以作为结论,我更喜欢 max(A(:))
,但如果您认为 max(max(A))
更清楚,您可能会使用它。
在我的机器上没有真正值得担心的时间差异。
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