Skip to content

Matrix Logarithm

The matrix logarithm is the inverse of matrix exponential.

linalg.logm

1. Basic Usage

import numpy as np
from scipy import linalg

def main():
    A = np.array([[2, 0],
                  [0, 3]])

    log_A = linalg.logm(A)

    print("A =")
    print(A)
    print()
    print("log(A) =")
    print(log_A)

if __name__ == "__main__":
    main()

2. Inverse Relationship

import numpy as np
from scipy import linalg

def main():
    A = np.array([[1, 0.5],
                  [0, 2]])

    # log(exp(A)) = A
    exp_A = linalg.expm(A)
    log_exp_A = linalg.logm(exp_A)

    print("A =")
    print(A)
    print()
    print("log(exp(A)) =")
    print(log_exp_A.real.round(10))

if __name__ == "__main__":
    main()

3. exp(log(A)) = A

import numpy as np
from scipy import linalg

def main():
    A = np.array([[2, 1],
                  [0, 3]])

    log_A = linalg.logm(A)
    exp_log_A = linalg.expm(log_A)

    print("A =")
    print(A)
    print()
    print("exp(log(A)) =")
    print(exp_log_A.real.round(10))

if __name__ == "__main__":
    main()

Requirements

1. No Negative Eigenvalues

import numpy as np
from scipy import linalg

def main():
    # Matrix with negative eigenvalue
    A = np.array([[-1, 0],
                  [0, 2]])

    # logm may return complex result
    log_A = linalg.logm(A)

    print("A eigenvalues:", np.linalg.eigvals(A))
    print()
    print("log(A) (complex):")
    print(log_A)

if __name__ == "__main__":
    main()

2. Nonsingular Matrix

import numpy as np
from scipy import linalg

def main():
    # Singular matrix - logarithm undefined
    A = np.array([[1, 0],
                  [0, 0]])

    try:
        log_A = linalg.logm(A)
        print(log_A)
    except Exception as e:
        print(f"Error: log undefined for singular matrix")

if __name__ == "__main__":
    main()

Applications

1. Rotation Interpolation

import numpy as np
from scipy import linalg

def main():
    # Interpolate between rotations
    theta1, theta2 = 0, np.pi/2

    R1 = np.array([[np.cos(theta1), -np.sin(theta1)],
                   [np.sin(theta1), np.cos(theta1)]])
    R2 = np.array([[np.cos(theta2), -np.sin(theta2)],
                   [np.sin(theta2), np.cos(theta2)]])

    # Interpolation: R(t) = R1 @ exp(t * log(R1.T @ R2))
    log_diff = linalg.logm(R1.T @ R2)

    for t in [0, 0.25, 0.5, 0.75, 1.0]:
        R_t = R1 @ linalg.expm(t * log_diff)
        angle = np.arctan2(R_t[1, 0], R_t[0, 0])
        print(f"t={t}: angle = {np.degrees(angle):.1f}°")

if __name__ == "__main__":
    main()

2. Principal Logarithm

import numpy as np
from scipy import linalg

def main():
    # For positive definite matrix, log is real
    A = np.array([[4, 2],
                  [2, 3]])

    log_A = linalg.logm(A)

    print("Symmetric positive definite A:")
    print(A)
    print()
    print("log(A) (real):")
    print(log_A.real.round(6))

if __name__ == "__main__":
    main()

Summary

Function Description
linalg.logm(A) Matrix logarithm

Key: Requires nonsingular A. May be complex for matrices with negative eigenvalues.