code: def images_to_matrix(image_list, mask=None, sigma=None, epsilon=0.5 ):
      
      def listfunc(x):
          if np.sum(np.array(x.shape) - np.array(mask.shape)) != 0:
              x = reg.resample_image_to_target(x, mask, 2)
          return x[mask]
  
      if mask is None:
          mask = utils.get_mask(image_list[0])
  
      num_images = len(image_list)
      mask_arr = mask.numpy() >= epsilon
      num_voxels = np.sum(mask_arr)
  
      data_matrix = np.empty((num_images, num_voxels))
      do_smooth = sigma is not None
      for i,img in enumerate(image_list):
          if do_smooth:
              data_matrix[i, :] = listfunc(utils.smooth_image(img, sigma, sigma_in_physical_coordinates=True))
          else:
              data_matrix[i,:] = listfunc(img)
      return data_matrix
docs: Read images into rows of a matrix, given a mask - much faster for
      large datasets as it is based on C++ implementations.
  
      ANTsR function: `imagesToMatrix`
  
      Arguments
      ---------
      image_list : list of ANTsImage types
          images to convert to ndarray
  
      mask : ANTsImage (optional)
          image containing binary mask. voxels in the mask are placed in the matrix
  
      sigma : scaler (optional)
          smoothing factor
  
      epsilon : scalar
          threshold for mask
  
      Returns
      -------
      ndarray
          array with a row for each image
          shape = (N_IMAGES, N_VOXELS)
  
      Example
      -------
      >>> import ants
      >>> img = ants.image_read(ants.get_ants_data('r16'))
      >>> img2 = ants.image_read(ants.get_ants_data('r16'))
      >>> img3 = ants.image_read(ants.get_ants_data('r16'))
      >>> mat = ants.image_list_to_matrix([img,img2,img3])