了解 MATLAB 计算中的壁时间抖动

计算科学 matlab
2021-12-10 21:44:25

我正在研究一篇关于计算任意矩阵的广义逆的迭代方法的研究论文。我正在研究以下迭代方法:A

Yk+1=Yk+Yk(IAYk),
给定一个初始近似我很难理解如何测量这种方法在 15 次迭代中所花费的计算时间。我制作了 MATLAB 代码并使用and来计算它。但是每次我点击运行程序时,它都会向我显示不同的计算时间值。Y0tictoc

为什么不同运行的计算时间不同?

这是我的代码

A = [1 4 0 
     2 3 0 
     2 0 1
     0 0 0]; % given matrix

Y0 = [0.0101 0.0202 0.0202 0
      0.0404 0.0303 0      0
      0      0      0.0101 0]; % initial approximation

I = eye(4);     

tic

for n=1:15    
    Y1 = zeros(4,3);
    % compute sequence of approximations
    Y1 = Y0+Y0*(I-A*Y0) 
    Y0 = Y1;
end

toc
1个回答

您的代码中有几个问题。

  1. Y1 = Y0+Y0*(I-A*Y0)语句后没有分号。实际上,您正在计时屏幕输出Y1而不是计算时间

  2. 迭代应该写成

    for n=1:15    
        Y0 = Y0+Y0*(I-A*Y0);
    end
    

    分配 Y1,分配给Y1,然后Y0是无用的。

  3. 最后你甚至可以进一步简化Y0 = 2*Y0 - Y0*(A*Y0) ;

编辑

应用这些修改后,您会看到测量的时间变得非常小(100μs在我的机器上)。通常对于如此小的经过时间,该tic, toc方法被认为是不准确的。

计时小段代码相当困难,因此请考虑我在这里的回答只是一个简单的提示,而不是准确而深入的答案。

本质上,您必须测量更大的间隔(大约一秒):如果您有兴趣估计单次迭代的时间,您可以简单地增加循环中的迭代次数并将总时间除以迭代次数。(更准确地说,您还应该为空循环计时,以估计与循环本身相关的开销。)如果您有兴趣估计总时间(init Y0、循环开销和 15 次迭代),您应该重复for, end一个相当大的数字次,并测量总时间。这是一个改编自 MATLAB 的示例help toc

REPS = 1000; minTime = Inf; nsum = 10;
tic;
for i=1:REPS
  tstart = tic;
  % init Y0
  Y0 = ...
  for n=1:15    
      Y0 = Y0+Y0*(I-A*Y0);
  end
  telapsed = toc(tstart);
  minTime = min(telapsed,minTime);
end
averageTime = toc/REPS;

您必须试验迭代次数(第一种方法)和REPS(第二种方法)才能找到一个合理的数字,其中tic, toc误差足够小。