Skip to main content
`Ctrl`+`K`
scipy.linalg.

# fiedler

scipy.linalg.fiedler(a)

  Returns a symmetric Fiedler matrix

  Given an sequence of numbers a, Fiedler matrices have the structure `F[i, j] = np.abs(a[i] - a[j])`, and hence zero diagonals and nonnegative entries. A Fiedler matrix has a dominant positive eigenvalue and other eigenvalues are negative. Although not valid generally, for certain inputs, the inverse and the determinant can be derived explicitly as given in [1].

  Array argument(s) of this function may have additional “batch” dimensions prepended to the core shape. In this case, the array is treated as a batch of lower-dimensional slices; see Batched Linear Operations for details.

  Parameters:
    a(…, n,) array_like

      Coefficient array. N-dimensional arrays are treated as a batch: each slice along the last axis is a 1-D coefficient array.

  Returns:
    F(…, n, n) ndarray

      Fiedler matrix. For batch input, each slice of shape `(n, n)` along the last two dimensions of the output corresponds with a slice of shape `(n,)` along the last dimension of the input.

  See also

  `circulant`, `toeplitz`

  Notes

  Added in version 1.3.0.

  Array API Standard Support

  `fiedler` has experimental support for Python Array API Standard compatible backends in addition to NumPy. Please consider testing these features by setting an environment variable `SCIPY_ARRAY_API=1` and providing CuPy, PyTorch, JAX, or Dask arrays as array arguments. The following combinations of backend and device (or other capability) are supported.

  Library | CPU | GPU
  --- | --- | ---
  NumPy | ✅ | n/a
  CuPy | n/a | ✅
  PyTorch | ✅ | ✅
  JAX | ✅ | ✅
  Dask | ✅ | n/a

  > See Support for the array API standard for more information.

  References

  [1]

  J. Todd, “Basic Numerical Mathematics: Vol.2 : Numerical Algebra”, 1977, Birkhauser, DOI:10.1007/978-3-0348-7286-7

  Examples

      >>> import numpy as np
      >>> from scipy.linalg import det, inv, fiedler
      >>> a = [1, 4, 12, 45, 77]
      >>> n = len(a)
      >>> A = fiedler(a)
      >>> A
      array([[ 0,  3, 11, 44, 76],
             [ 3,  0,  8, 41, 73],
             [11,  8,  0, 33, 65],
             [44, 41, 33,  0, 32],
             [76, 73, 65, 32,  0]])

  The explicit formulas for determinant and inverse seem to hold only for monotonically increasing/decreasing arrays. Note the tridiagonal structure and the corners.

      >>> Ai = inv(A)
      >>> Ai[np.abs(Ai) < 1e-12] = 0.  # cleanup the numerical noise for display
      >>> Ai
      array([[-0.16008772,  0.16666667,  0.        ,  0.        ,  0.00657895],
             [ 0.16666667, -0.22916667,  0.0625    ,  0.        ,  0.        ],
             [ 0.        ,  0.0625    , -0.07765152,  0.01515152,  0.        ],
             [ 0.        ,  0.        ,  0.01515152, -0.03077652,  0.015625  ],
             [ 0.00657895,  0.        ,  0.        ,  0.015625  , -0.00904605]])
      >>> det(A)
      15409151.999999998
      >>> (-1)**(n-1) * 2**(n-2) * np.diff(a).prod() * (a[-1] - a[0])
      15409152