Search code examples
c++linear-algebraeigen3

Permute Columns of Matrix in Eigen


I read this answer Randomly permute rows/columns of a matrix with eigen

But they initialize the permutation matrix as the identity matrix and do a random shuffle. I'm wondering how I can initialize the matrix to a specific permutation.

For example, if I have a vector of integers where each (index, value) pair means I want to move column "index" to column "value" how can I do this?

Eigen::MatrixXi M = Eigen::MatrixXi::Random(3,3);
std::vector<int> my_perm = {1,2,0};
some_function to return Matrix [M.col(1), M.col(2), M.col(0)]

EDIT: dtell kindly answered my original question below.

ADDITIONAL INFO:

For anyone else looking at this -- if you want to permute a matrix with a vector of unknown (at compile time) quanties, you can do the following:

Eigen::VectorXi indices(A.cols());
for(long i = 0; i < indices.size(); ++i) {
    indices[i] = vector_of_indices[i];
}
Eigen::PermutationMatrix<Eigen::Dynamic, Eigen::Dynamic> perm;
perm.indices() = indices;
Eigen::MatrixXd A_permute = A * perm; \\ permute the columns

Solution

  • If I understand you correctly, the answer to your question is this slight modification of the answer you have linked

    Matrix3i A = Matrix3i::Random();
    PermutationMatrix<3, 3> perm;
    // Your permutation
    perm.indices() = { 1, 2, 0 };
    // Permutate rows
    A = perm * A;