### 2.6 Build matrix from other matrices and vectors

2.6.1 First example
2.6.2 second example

#### 2.6.1 First example

Given column vectors $$v1= \left [ {\begin {array}{c} 1\\ 2\\ 3 \end {array}} \right ]$$ and $$v2= \left [ {\begin {array}{c} 4\\ 5\\ 6 \end {array}} \right ]$$ and $$v3= \left [ {\begin {array}{c} 7\\ 8\\ 9 \end {array}} \right ]$$ and $$v4=\left [ {\begin {array}{c} 10\\ 11\\ 12 \end {array}} \right ]$$ generate the matrix m=\left [ {\begin {array}{cc} v_1&v_2\\ v_3&v_4 \end {array}} \right ] = \left [ {\begin {array}{cc} 1&4\\ \noalign {\medskip }2&5 \\ \noalign {\medskip }3&6\\ \noalign {\medskip }7&10\\ \noalign {\medskip } 8&11\\ \noalign {\medskip }9&12\end {array}} \right ]

Matlab was the easiest of all to do these operations with. No surprise, as Matlab was designed for Matrix and vector operations. But I was surprised that Maple actually had good support for these things, using its <> notation, which makes working with matrices and vectors much easier.

The command ArrayFlatten is essential for this in Mathematica.

Notice the need to use Transpose[{v}] in order to convert it to a column matrix. This is needed since in Mathematica, a list can be a row or column, depending on context.

Mathematica

 v1 = {1, 2, 3}; v2 = {4, 5, 6}; v3 = {7, 8, 9}; v4 = {10, 11, 12}; m = ArrayFlatten[ {{Transpose@{v1}, Transpose@{v2}}, {Transpose@{v3}, Transpose@{v4}}} ]  $$\left ( {\begin {array}{cc} 1 & 4 \\ 2 & 5 \\ 3 & 6 \\ 7 & 10 \\ 8 & 11 \\ 9 & 12 \\ \end {array}} \right )$$

Matlab

 v1=[1,2,3]'; v2=[4,5,6]'; v3=[7,8,9]'; v4=[10,11,12]'; m=[v1 v2;v3 v4]  m = 1 4 2 5 3 6 7 10 8 11 9 12 

Maple

 restart; v1:=<1,2,3>; #column by default v2:=<4,5,6>; v3:=<7,8,9>; v4:=<10,11,12>; m:=< , >; #or using Vector/Matrix notations restart; v1:=Vector([1,2,3]); #column by default v2:=Vector([4,5,6]); #column by default v3:=Vector([7,8,9]); #column by default v4:=Vector([10,11,12]); #column by default m:=Matrix([ [v1,v2],[v3,v4]])  \left [ {\begin {array}{cc} 1&4\\ \noalign {\medskip }2&5 \\ \noalign {\medskip }3&6\\ \noalign {\medskip }7&10\\ \noalign {\medskip } 8&11\\ \noalign {\medskip }9&12\end {array}} \right ]

Python

 import numpy as np v1=np.array((1,2,3)); v2=np.array((4,5,6)); v3=np.array((7,8,9)); v4=np.array((10,11,12)); r1 =np.hstack([(v1,v2)]).T r2 =np.hstack([(v3,v4)]).T mat = np.vstack((r1,r2))  Another way v1=np.array([(1,2,3)]).T v2=np.array([(4,5,6)]).T v3=np.array([(7,8,9)]).T v4=np.array([(10,11,12)]).T mat =np.hstack(( np.vstack((v1,v3)), np.vstack((v2,v4))) )  Out[211]: array([[ 1, 4], [ 2, 5], [ 3, 6], [ 7, 10], [ 8, 11], [ 9, 12]]) 

Fortran

 PROGRAM main IMPLICIT none INTEGER :: i INTEGER , DIMENSION(3) :: v1,v2,v3,v4 INTEGER , DIMENSION(6,2) :: m v1 = [1,2,3]; v2=[4,5,6]; v3=[7,8,9]; v4=[10,11,12]; m(1:3,1) = v1; m(1:3,2)=v2; m(4:,1)=v3; m(4:,2)=v4; DO i=1,size(m,1) PRINT *, m(i,:) END DO END PROGRAM main  Using the RESHAPE command PROGRAM main IMPLICIT none INTEGER :: i INTEGER , DIMENSION(3) :: v1,v2,v3,v4 INTEGER , DIMENSION(6,2) :: m v1 = [1,2,3]; v2=[4,5,6]; v3=[7,8,9]; v4=[10,11,12]; m = RESHAPE([v1,v3,v2,v4], SHAPE(m), ORDER=[1,2]) DO i=1,size(m,1) PRINT *, m(i,:) END DO END PROGRAM main  >gfortran -Wall foo.f90 >./a.out 1 4 2 5 3 6 7 10 8 11 9 12 

#### 2.6.2 second example

Given mix of matrices and vectors, such as $$v1= \left [ {\begin {array}{c} 1\\ 2\\ 3 \end {array}} \right ]$$ and $$v2= \left [ {\begin {array}{cc} 4& 5\\ 6& 7\\ 8& 9 \end {array}} \right ]$$ and $$v3= \left [ {\begin {array}{c} 10\\ 11\\ 12 \end {array}} \right ]$$ and $$v4=\left [ {\begin {array}{c} 13\\ 14\\ 15 \end {array}} \right ]$$ and

$$v5=\left [ {\begin {array}{c} 16\\ 17\\ 18 \end {array}} \right ]$$

generate the matrix 6 by 3 matrix m= \left [ {\begin {array}{ccc} v1&v2\\v3&v4&v5\end {array}}\right ]= \left [ {\begin {array}{ccc} 1&4&5\\ \noalign {\medskip }2&6&7 \\ \noalign {\medskip }3&8&9\\ \noalign {\medskip }10&13&16 \\ \noalign {\medskip }11&14&17\\ \noalign {\medskip }12&15&18\end {array}} \right ]

Mathematica, thanks for function by Kuba at Mathematica stackexachage, this becomes easy to do

Mathematica

myArrayFlatten = Flatten /@ Flatten[#, {{1, 3}}] &

v1 = {1, 2, 3};
v2 = {{4, 5}, {6, 7}, {8, 9}};
v3 = {10, 11, 12};
v4 = {13, 14, 15};
v5 = {16, 17, 18};

m={
{v1, v2},
{v3, v4, v5},
} // myArrayFlatten



Maple

restart;
v1:=<1,2,3>; #column by default
v2:=<<4|5>,
<6|7>,
<8|9>>;
v3:=<10,11,12>;
v4:=<13,14,15>;
v5:=<16,17,18>;
m:=< <v1|v2>,
<v3|v4|v5>>;



Matlab

v1=[1,2,3]';
v2=[4,5;6,7;8,9];
v3=[10,11,12]';
v4=[13,14,15]';
v5=[16,17,18]';

m=[v1 v2;v3 v4 v5]



Fortran

PROGRAM main   IMPLICIT none
INTEGER :: i
INTEGER , DIMENSION(3)   :: v1,v3,v4,v5
INTEGER , DIMENSION(3,2) :: v2 = RESHAPE([4,6,8,5,7,9],SHAPE(v2),ORDER=[1,2])
INTEGER , DIMENSION(6,3) :: m
v1 = [1,2,3];   v3=[10,11,12];
v4 =[13,14,15]; v5=[16,17,18];
m = RESHAPE([v1,v3,v2(:,1),v4,v2(:,2),v5], SHAPE(m), ORDER=[1,2])

DO i=1,size(m,1)
PRINT *, m(i,:)
END DO

END PROGRAM main


>gfortran -Wall foo.f90
>./a.out
1           4           5
2           6           7
3           8           9
10          13          16
11          14          17
12          15          18