### 18.4 Functions of a Matrix ¶

: `r =` expm `(A)`

Return the exponential of a matrix.

The matrix exponential is defined as the infinite Taylor series

```expm (A) = I + A + A^2/2! + A^3/3! + ...
```

However, the Taylor series is not the way to compute the matrix exponential; see Moler and Van Loan, Nineteen Dubious Ways to Compute the Exponential of a Matrix, SIAM Review, 1978. This routine uses Ward’s diagonal Padé approximation method with three step preconditioning (SIAM Journal on Numerical Analysis, 1977). Diagonal Padé approximations are rational polynomials of matrices

```     -1
D (A)   N (A)
```

whose Taylor series matches the first `2q+1` terms of the Taylor series above; direct evaluation of the Taylor series (with the same preconditioning steps) may be desirable in lieu of the Padé approximation when `Dq(A)` is ill-conditioned.

: `s =` logm `(A)`
: `s =` logm `(A, opt_iters)`
: `[s, iters] =` logm `(…)`

Compute the matrix logarithm of the square matrix A.

The implementation utilizes a Padé approximant and the identity

```logm (A) = 2^k * logm (A^(1 / 2^k))
```

The optional input opt_iters is the maximum number of square roots to compute and defaults to 100.

The optional output iters is the number of square roots actually computed.

: `s =` sqrtm `(A)`
: `[s, error_estimate] =` sqrtm `(A)`

Compute the matrix square root of the square matrix A.

Ref: N.J. Higham. A New sqrtm for MATLAB. Numerical Analysis Report No. 336, Manchester Centre for Computational Mathematics, Manchester, England, January 1999.

: `C =` kron `(A, B)`
: `C =` kron `(A1, A2, …)`

Form the Kronecker product of two or more matrices.

This is defined block by block as

```c = [ a(i,j)*b ]
```

For example:

```kron (1:4, ones (3, 1))
⇒  1  2  3  4
1  2  3  4
1  2  3  4
```

If there are more than two input arguments A1, A2, …, An the Kronecker product is computed as

```kron (kron (A1, A2), ..., An)
```

Since the Kronecker product is associative, this is well-defined.

: `C =` tensorprod `(A, B, dimA, dimB)`
: `C =` tensorprod `(A, B, dim)`
: `C =` tensorprod `(A, B)`
: `C =` tensorprod `(A, B, "all")`
: `C =` tensorprod `(A, B, …, "NumDimensionsA", value)`

Compute the tensor product between numeric tensors A and B.

The dimensions of A and B that are contracted are defined by dimA and dimB, respectively. dimA and dimB are scalars or equal length vectors that define the dimensions to match up. The matched dimensions of A and B must have the same number of elements.

When only dim is used, it is equivalent to `dimA = dimB = dim`.

When no dimensions are specified, `dimA = dimB = []`. This computes the outer product between A and B.

Using the `"all"` option results in the inner product between A and B. This requires `size (A) == size (B)`.

Use the property-value pair with the property name `"NumDimensionsA"` when A has trailing singleton dimensions that should be transferred to C. The specified value should be the total number of dimensions of A.

MATLAB Compatibility: Octave does not currently support the `"property_name=value"` syntax for the `"NumDimensionsA"` parameter.

: `C =` blkmm `(A, B)`

Compute products of matrix blocks.

The blocks are given as 2-dimensional subarrays of the arrays A, B. The size of A must have the form `[m,k,…]` and size of B must be `[k,n,…]`. The result is then of size `[m,n,…]` and is computed as follows:

```for i = 1:prod (size (A)(3:end))
C(:,:,i) = A(:,:,i) * B(:,:,i)
endfor
```

: `X =` sylvester `(A, B, C)`

Solve the Sylvester equation.

The Sylvester equation is defined as:

```A X + X B = C
```

The solution is computed using standard LAPACK subroutines.

For example:

```sylvester ([1, 2; 3, 4], [5, 6; 7, 8], [9, 10; 11, 12])
⇒ [ 0.50000, 0.66667; 0.66667, 0.50000 ]
```