Sylvester

As long as both \(A\) and \(B\) only have eigenvalues in the open right-half plane, the following routines solve for \(X\) in the Sylvester equation

\[A X + X B = C\]

via computing \(\text{sgn}(W)\), where

\[\begin{split}W = \begin{pmatrix} A & -C \\ 0 & -B \end{pmatrix}.\end{split}\]

Python API

Sylvester(A, B, C)
SylvesterPreformed(m, W)

C++ API

void Sylvester(const Matrix<F> &A, const Matrix<F> &B, const Matrix<F> &C, Matrix<F> &X, SignCtrl<Base<F>> signCtrl = SignCtrl<Base<F>>())
void Sylvester(const AbstractDistMatrix<F> &A, const AbstractDistMatrix<F> &B, const AbstractDistMatrix<F> &C, AbstractDistMatrix<F> &X, SignCtrl<Base<F>> signCtrl = SignCtrl<Base<F>>())

Versions where the individual matrices are passed in

void Sylvester(int m, Matrix<F> &W, Matrix<F> &X, SignCtrl<Base<F>> signCtrl = SignCtrl<Base<F>>())
void Sylvester(int m, AbstractDistMatrix<F> &W, AbstractDistMatrix<F> &X, SignCtrl<Base<F>> signCtrl = SignCtrl<Base<F>>())

Versions which saves space by accepting the preformed \(W\) matrix

C API

Single-precision

ElError ElSylvester_s(ElConstMatrix_s A, ElConstMatrix_s B, ElConstMatrix_s C, ElMatrix_s X)
ElError ElSylvesterDist_s(ElConstDistMatrix_s A, ElConstDistMatrix_s B, ElConstDistMatrix_s C, ElDistMatrix_s X)

Versions where the individual matrices are passed in

ElError ElSylvesterPreformed_s(ElInt m, ElMatrix_s W, ElMatrix_s X)
ElError ElSylvesterPreformedDist_s(ElInt m, ElMatrix_s W, ElMatrix_s X)

Versions which save memory by accepting the preformed \(W\) matrix

Double-precision

ElError ElSylvester_d(ElConstMatrix_d A, ElConstMatrix_d B, ElConstMatrix_d C, ElMatrix_d X)
ElError ElSylvesterDist_d(ElConstDistMatrix_d A, ElConstDistMatrix_d B, ElConstDistMatrix_d C, ElDistMatrix_d X)

Versions where the individual matrices are passed in

ElError ElSylvesterPreformed_d(ElInt m, ElMatrix_d W, ElMatrix_d X)
ElError ElSylvesterPreformedDist_d(ElInt m, ElMatrix_d W, ElMatrix_d X)

Versions which save memory by accepting the preformed \(W\) matrix

Single-precision complex

ElError ElSylvester_c(ElConstMatrix_c A, ElConstMatrix_c B, ElConstMatrix_c C, ElMatrix_c X)
ElError ElSylvesterDist_c(ElConstDistMatrix_c A, ElConstDistMatrix_c B, ElConstDistMatrix_c C, ElDistMatrix_c X)

Versions where the individual matrices are passed in

ElError ElSylvesterPreformed_c(ElInt m, ElMatrix_c W, ElMatrix_c X)
ElError ElSylvesterPreformedDist_c(ElInt m, ElMatrix_c W, ElMatrix_c X)

Versions which save memory by accepting the preformed \(W\) matrix

Double-precision complex

ElError ElSylvester_z(ElConstMatrix_z A, ElConstMatrix_z B, ElConstMatrix_z C, ElMatrix_z X)
ElError ElSylvesterDist_z(ElConstDistMatrix_z A, ElConstDistMatrix_z B, ElConstDistMatrix_z C, ElDistMatrix_z X)

Versions where the individual matrices are passed in

ElError ElSylvesterPreformed_z(ElInt m, ElMatrix_z W, ElMatrix_z X)
ElError ElSylvesterPreformedDist_z(ElInt m, ElMatrix_z W, ElMatrix_z X)

Versions which save memory by accepting the preformed \(W\) matrix