Skeleton decomposition

Implementation

Example driver

Skeleton decompositions are essentially two-sided interpolative decompositions, but the terminology is unfortunately extremely contested. We follow the convention that a skeleton decomposition is an approximation

\[A \approx A_C Z A_R,\]

where \(A_C\) is a (small) selection of columns of \(A\), \(A_R\) is a (small) selection of rows of \(A\), and \(Z\) is a (small) square matrix. When \(Z\) is allowed to be rectangular, it is more common to call this a CUR decomposition.

Note that the following routines do not directly return \(A_R\) and \(A_C\); the permutation matrices which implicitly define them are returned instead.

C++ API

void Skeleton(const Matrix<F> &A, Matrix<int> &pR, Matrix<int> &pC, Matrix<F> &Z, const QRCtrl<Base<F>> ctrl = QRCtrl<Base<F>>())
void Skeleton(const AbstractDistMatrix<F> &A, AbstractDistMatrix<int> &pR, AbstractDistMatrix<int> &pC, const QRCtrl<Base<F>> ctrl = QRCtrl<Base<F>>())

C API

ElError ElSkeleton_s(ElConstMatrix_s A, ElMatrix_i pR, ElMatrix_i pC, ElMatrix_s Z, ElQRCtrl_s ctrl)
ElError ElSkeleton_d(ElConstMatrix_d A, ElMatrix_i pR, ElMatrix_i pC, ElMatrix_d Z, ElQRCtrl_d ctrl)
ElError ElSkeleton_c(ElConstMatrix_c A, ElMatrix_i pR, ElMatrix_i pC, ElMatrix_c Z, ElQRCtrl_s ctrl)
ElError ElSkeleton_z(ElConstMatrix_z A, ElMatrix_i pR, ElMatrix_i pC, ElMatrix_z Z, ElQRCtrl_d ctrl)
ElError ElSkeletonDist_s(ElConstDistMatrix_s A, ElDistMatrix_i pR, ElDistMatrix_i pC, ElDistMatrix_s Z, ElQRCtrl_s ctrl)
ElError ElSkeletonDist_d(ElConstDistMatrix_d A, ElDistMatrix_i pR, ElDistMatrix_i pC, ElDistMatrix_d Z, ElQRCtrl_d ctrl)
ElError ElSkeletonDist_c(ElConstDistMatrix_c A, ElDistMatrix_i pR, ElDistMatrix_i pC, ElDistMatrix_c Z, ElQRCtrl_s ctrl)
ElError ElSkeletonDist_z(ElConstDistMatrix_z A, ElDistMatrix_i pR, ElDistMatrix_i pC, ElDistMatrix_z Z, ElQRCtrl_d ctrl)