# Interleave two vectors in Eigen

## 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.