Article · Wikipedia archive · Last revised Jun 11, 2026

Duplication and elimination matrices

In mathematics, especially in linear algebra and matrix theory, the duplication matrix and the elimination matrix are linear transformations used for transforming half-vectorizations of matrices into vectorizations or (respectively) vice versa.

Last revised
Jun 11, 2026
Read time
≈ 4 min
Length
808 w
Citations
1
Source

In mathematics, especially in linear algebra and matrix theory, the duplication matrix and the elimination matrix are linear transformations used for transforming half-vectorizations of matrices into vectorizations or (respectively) vice versa.

Duplication matrix

The duplication matrix D n {\displaystyle D_{n}} is the unique n 2 × n ( n + 1 ) 2 {\displaystyle n^{2}\times {\frac {n(n+1)}{2}}} matrix which, for any n × n {\displaystyle n\times n} symmetric matrix A {\displaystyle A} , transforms v e c h ( A ) {\displaystyle \mathrm {vech} (A)} into v e c ( A ) {\displaystyle \mathrm {vec} (A)} :

D n v e c h ( A ) = v e c ( A ) {\displaystyle D_{n}\mathrm {vech} (A)=\mathrm {vec} (A)} .

For the 2 × 2 {\displaystyle 2\times 2} symmetric matrix A = [ a b b d ] {\displaystyle A=\left[{\begin{smallmatrix}a&b\\b&d\end{smallmatrix}}\right]} , this transformation reads

D n v e c h ( A ) = v e c ( A ) [ 1 0 0 0 1 0 0 1 0 0 0 1 ] [ a b d ] = [ a b b d ] {\displaystyle D_{n}\mathrm {vech} (A)=\mathrm {vec} (A)\implies {\begin{bmatrix}1&0&0\\0&1&0\\0&1&0\\0&0&1\end{bmatrix}}{\begin{bmatrix}a\\b\\d\end{bmatrix}}={\begin{bmatrix}a\\b\\b\\d\end{bmatrix}}}


The explicit formula for calculating the duplication matrix for a n × n {\displaystyle n\times n} matrix is:

D n T = i j u i j ( v e c T i j ) T {\displaystyle D_{n}^{T}=\sum \limits _{i\geq j}u_{ij}(\mathrm {vec} T_{ij})^{T}}

Where:

  • u i j {\displaystyle u_{ij}} is a unit vector of order 1 2 n ( n + 1 ) {\displaystyle {\frac {1}{2}}n(n+1)} having the value 1 {\displaystyle 1} in the position ( j 1 ) n + i 1 2 j ( j 1 ) {\displaystyle (j-1)n+i-{\frac {1}{2}}j(j-1)} and 0 elsewhere;
  • T i j {\displaystyle T_{ij}} is a n × n {\displaystyle n\times n} matrix with 1 in position ( i , j ) {\displaystyle (i,j)} and ( j , i ) {\displaystyle (j,i)} and zero elsewhere

Here is a C++ function using Armadillo (C++ library):

arma::mat duplication_matrix(const int &n) {
    arma::mat out((n*(n+1))/2, n*n, arma::fill::zeros);
    for (int j = 0; j < n; ++j) {
        for (int i = j; i < n; ++i) {
            arma::vec u((n*(n+1))/2, arma::fill::zeros);
            u(j*n+i-((j+1)*j)/2) = 1.0;
            arma::mat T(n,n, arma::fill::zeros);
            T(i,j) = 1.0;
            T(j,i) = 1.0;
            out += u * arma::trans(arma::vectorise(T));
        }
    }
    return out.t();
}

Elimination matrix

An elimination matrix L n {\displaystyle L_{n}} is a n ( n + 1 ) 2 × n 2 {\displaystyle {\frac {n(n+1)}{2}}\times n^{2}} matrix which, for any n × n {\displaystyle n\times n} matrix A {\displaystyle A} , transforms v e c ( A ) {\displaystyle \mathrm {vec} (A)} into v e c h ( A ) {\displaystyle \mathrm {vech} (A)} :

L n v e c ( A ) = v e c h ( A ) {\displaystyle L_{n}\mathrm {vec} (A)=\mathrm {vech} (A)} 1

By the explicit (constructive) definition given by Magnus & Neudecker (1980), the 1 2 n ( n + 1 ) {\displaystyle {\frac {1}{2}}n(n+1)} by n 2 {\displaystyle n^{2}} elimination matrix L n {\displaystyle L_{n}} is given by

L n = i j u i j v e c ( E i j ) T = i j ( u i j e j T e i T ) , {\displaystyle L_{n}=\sum _{i\geq j}u_{ij}\mathrm {vec} (E_{ij})^{T}=\sum _{i\geq j}(u_{ij}\otimes e_{j}^{T}\otimes e_{i}^{T}),}

where e i {\displaystyle e_{i}} is a unit vector whose i {\displaystyle i} -th element is one and zeros elsewhere, and E i j = e i e j T {\displaystyle E_{ij}=e_{i}e_{j}^{T}} .

Here is a C++ function using Armadillo (C++ library):

arma::mat elimination_matrix(const int &n) {
    arma::mat out((n*(n+1))/2, n*n, arma::fill::zeros);
    for (int j = 0; j < n; ++j) {
        arma::rowvec e_j(n, arma::fill::zeros);
        e_j(j) = 1.0;
        for (int i = j; i < n; ++i) {
            arma::vec u((n*(n+1))/2, arma::fill::zeros);
            u(j*n+i-((j+1)*j)/2) = 1.0;
            arma::rowvec e_i(n, arma::fill::zeros);
            e_i(i) = 1.0;
            out += arma::kron(u, arma::kron(e_j, e_i));
        }
    }
    return out;
}

For the 2 × 2 {\displaystyle 2\times 2} matrix A = [ a b c d ] {\displaystyle A=\left[{\begin{smallmatrix}a&b\\c&d\end{smallmatrix}}\right]} , one choice for this transformation is given by

L n v e c ( A ) = v e c h ( A ) [ 1 0 0 0 0 1 0 0 0 0 0 1 ] [ a c b d ] = [ a c d ] {\displaystyle L_{n}\mathrm {vec} (A)=\mathrm {vech} (A)\implies {\begin{bmatrix}1&0&0&0\\0&1&0&0\\0&0&0&1\end{bmatrix}}{\begin{bmatrix}a\\c\\b\\d\end{bmatrix}}={\begin{bmatrix}a\\c\\d\end{bmatrix}}} .
Notes

Notes

  1. Magnus & Neudecker (1980), Definition 3.1
References

References