Python
Eigenvalues
Sparse Matrices
Linear Algebra
Computational Mathematics

Computing generalized eigen values for sparse matrices in python

Data Structures & Algorithms practice on Codemia

Step through 300 algorithm problems with animated visualisers that show the data structure changing as the code runs.

Practice algorithms

Introduction

For a generalized eigenvalue problem, you are solving an equation of the form A x = λ M x rather than the simpler A x = λ x. When A and M are large sparse matrices, dense linear algebra routines are usually too expensive in both memory and runtime.

In Python, the usual approach is to keep the matrices sparse and use iterative solvers from scipy.sparse.linalg, especially eigsh for symmetric problems and eigs for more general ones.

The Generalized Eigenvalue Problem

If M is the identity matrix, the problem reduces to the standard eigenvalue case. When M is a separate matrix, it often represents a mass matrix, metric, or constraint operator in applications such as finite element methods and vibration analysis.

For large sparse problems, you usually do not want every eigenvalue. You want a small number of eigenpairs near part of the spectrum that matters physically or numerically.

Building Sparse Matrices

SciPy supports several sparse storage formats. CSR and CSC are the most common for computations.

Example setup:

python
1import numpy as np
2from scipy.sparse import diags
3
4n = 100
5
6A = diags(
7    diagonals=[-1 * np.ones(n - 1), 2 * np.ones(n), -1 * np.ones(n - 1)],
8    offsets=[-1, 0, 1],
9    format="csr",
10)
11
12M = diags(np.ones(n), format="csr")

This creates a sparse tridiagonal stiffness-like matrix A and an identity-like mass matrix M.

Using eigsh for Symmetric Problems

If A and M are symmetric and the problem matches the assumptions of a Hermitian solver, eigsh is usually the first choice.

python
1from scipy.sparse.linalg import eigsh
2
3eigenvalues, eigenvectors = eigsh(A, k=4, M=M, which="SM")
4
5print(eigenvalues)
6print(eigenvectors.shape)

Important parameters:

  • 'k is the number of eigenvalues requested'
  • 'M is the second matrix in the generalized problem'
  • 'which="SM" asks for the smallest magnitude eigenvalues'

For symmetric problems, this is usually more stable and efficient than the fully general solver.

Using eigs for More General Matrices

If the matrices are not symmetric, use eigs instead:

python
1from scipy.sparse.linalg import eigs
2
3values, vectors = eigs(A, k=4, M=M, which="LM")
4print(values)

This handles a wider class of problems, but it may return complex-valued results even when the underlying data is real.

Shift-Invert for Interior Eigenvalues

One of the most important ideas in practical eigenvalue computation is that "smallest" or "interior" eigenvalues are often harder to obtain directly. Shift-invert mode helps target eigenvalues near a chosen value sigma.

python
values, vectors = eigsh(A, k=4, M=M, sigma=0.5, which="LM")
print(values)

This asks the solver to focus on eigenvalues near 0.5. In scientific computing, this is often much more useful than only asking for the largest magnitude values.

Why Sparsity Matters

A dense 10000 x 10000 matrix is usually too large to handle casually. Sparse storage keeps only the nonzero structure, which dramatically reduces memory use and enables iterative methods to scale to much larger problems.

That is also why you should avoid converting sparse matrices to dense arrays unless the problem size is genuinely small.

Bad pattern:

python
dense_A = A.toarray()

For large problems, this can destroy the whole point of using sparse linear algebra.

Interpreting the Results

The solver returns:

  • a vector of eigenvalues
  • a matrix whose columns are the corresponding eigenvectors

You can verify one eigenpair numerically:

python
1index = 0
2lam = eigenvalues[index]
3vec = eigenvectors[:, index]
4
5residual = A @ vec - lam * (M @ vec)
6print(np.linalg.norm(residual))

A small residual norm means the numerical solution is consistent with the generalized eigenvalue equation.

Common Pitfalls

The biggest pitfall is using eigs when the problem is symmetric and better handled by eigsh. The more specialized solver is usually preferable when its assumptions are satisfied.

Another issue is asking for too many eigenvalues. Iterative sparse solvers are designed for a small part of the spectrum, not for computing the full decomposition.

Choosing the wrong which parameter is also common. "Largest magnitude" is not the same as "smallest algebraic" or "closest to a target value." You need the option that matches the mathematical goal.

Finally, poor conditioning or a singular M matrix can make the problem unstable or fail outright. If the solver behaves unexpectedly, check the algebraic properties of the input matrices before tuning solver options blindly.

Summary

  • Use sparse matrix formats from SciPy to keep large eigenvalue problems tractable.
  • For A x = λ M x, pass M into eigsh or eigs rather than transforming the problem naively.
  • Prefer eigsh for symmetric problems and eigs for more general cases.
  • Use sigma when you need eigenvalues near a target region of the spectrum.
  • Validate results with a residual check instead of trusting raw output blindly.

Related reading
Course
Intermediate
27 lessons
15 hours
DSA Fundamentals

Master algorithmic patterns and data structures through hands-on LeetCode-style problems - from arrays and hashing to dynamic programming and advanced graphs.

View the course
Track what you have practised

A free account saves your progress, solutions and study plan across every problem on Codemia.

Data Structures & Algorithms practice on Codemia

Step through 300 algorithm problems with animated visualisers that show the data structure changing as the code runs.

Practice algorithms