Interleave two vectors in Eigen

Alec Jacobson

December 11, 2013

weblog/

Today I needed to interleave two vectors, e.g. A = [1,2,3,4] and B = [5,6,7,8] then I want to make C = [1,5,2,6,3,7,4,8].

In Eigen you can do this using the Map class:

VectorXi A(4);A<<1,2,3,4;
VectorXi B(4);B<<5,6,7,8;
VectorXi C(A.size()+B.size());
Map<VectorXi,0,InnerStride<2> >(C.data(),A.size()) = A;
Map<VectorXi,0,InnerStride<2> >(C.data()+1,B.size()) = B;

Note that |A.size() - B.size()| should be at most 1.

Update: Here's how to interleave rows of Eigen matrices:

MatrixXi A(2,3);A<<1,2,3,4,5,6;
MatrixXi B(2,3);B<<7,8,9,10,11,12;
MatrixXi C(A.rows()+B.rows(),A.cols());
Map<MatrixXi,0,Stride<Dynamic,2> >(C.data(),A.rows(),A.cols(),Stride<Dynamic,2>(2*A.rows(),2)) = A;
Map<MatrixXi,0,Stride<Dynamic,2> >(C.data()+1,B.rows(),B.cols(),Stride<Dynamic,2>(2*B.rows(),2)) = B;

Printing these matrices you'd see:

A = [
  1 2 3
  4 5 6
];
B = [
   7  8  9
  10 11 12
];
C = [
   1  2  3
   7  8  9
   4  5  6
  10 11 12
];

Note: This almost surely only works if you're using column major order.