title: How can I reduce runtime in my image matching code in MATLAB?
body: <p>I am trying to stabilize a video file in MATLAB using a simple image matching algorithm. Basically, I am taking a window of the first frame of the video and subtracting it with the nth frame. I want to end up with an array of x and y displacement vectors from the position of the nth frame to the first frame. The video is in a 1501x971 grayscale format with 391 frames.</p>
  
  <p>Below is my code. I have let the code run for 15+ minutes and still running. I have been searching for answers and implemented the int8 and preallocating matrix solutions that I've seen people suggesting but it still runs too long. Any help would be appreciated.</p>
  
  <pre><code>% Define image region (window)
  xmin = 35;
  xmax = 1465;
  ymin = 35;
  ymax = 940;
  
  % Matching algorithm
  error = uint16(10^8); % set error to a larger number than expecting in the loop
  deltax = 0;
  deltay = 0;
  deltaxArray = zeros(1,N,'int8');    % prealloacting arrays
  deltayArray = zeros(1,N,'int8');    % using int8 to optimize code
  deltaxArray(1) = 0;
  deltayArray(1) = 0;
  
  for n = 2:N % N = number of frames
      for deltay = -34:31         % Iterating over all possible displacements
          for deltax = -34:36
              current_error = uint16(sum(abs(f(1, ymin+deltay:ymax+deltay , xmin+deltax:xmax+deltax ) - f(n, ymin:ymax, xmin:xmax)),'all'));        % f is the video array
              if current_error &lt; error        % searching for the smallest error in the nth frame
                  error = current_error;      % set error if current error is smaller
                  deltaxArray(n) = deltax;    % save x displacement coordinate
                  deltayArray(n) = deltay;    % save y displacement coordinate
              end
          end
      end
      error = uint16(10^8);   % reset error for next iteration
  end
  </code></pre>