We wensen een rij reële getallen $$x$$ te coderen, en gebruiken hiertoe een reëele, inverteerbare $$n \times n$$ matrix $$C$$. De gecodeerde versie van $$x$$ ontstaat door rij $$x$$ in groepjes van $$n$$ te verdelen, namelijk
$$ (x_1 \ldots x_n),(x_{n+1} \ldots x_{2n}), \dots $$
Elk groepje wordt als kolomvector geïnterpreteerd, en per groepje ontstaat een nieuwe kolomvector, via

$$ \left( \begin{array}{c} y_1 \\ y_2 \\ \vdots \\ y_n \end{array} \right) =\mathbf{C} \left( \begin{array}{c} x_1 \\ x_2 \\ \vdots \\ x_n \end{array} \right), \left( \begin{array}{c} y_{n+1} \\ y_{n+2} \\ \vdots \\ y_{2n} \end{array} \right) =\mathbf{C} \left( \begin{array}{c} x_{n+1} \\ x_{n+2} \\ \vdots \\ x_{2n} \end{array} \right),\ldots $$

De gecodeerde versie van de rij $$x$$ ontstaat dan door alle kolomvectoren in een rij aaneen te schakelen, namelijk
$$ \left( \begin{array}{ccccccc} y_1 & \ldots & y_n & y_{n+1} & \ldots & y_{2n} & \ldots \end{array} \right) $$
Natuurlijk kan het gebeuren dat de lengte van $$x$$ geen geheel veelvoud van $$n$$ bedraagt. In dit geval vul je $$x$$ aan met 0-elementen tot de lengte van de te coderen rij een geheel veelvoud van $$n$$ bedraagt. Schrijf een functie $$\verb!codeer()!$$ met twee argumenten, namelijk de codeermatrix $$\verb!C!$$ en de codeerrij $$\verb!x!$$. Je mag veronderstellen dat $$\verb!C!$$ een reëele, vierkante en inverteerbare matrix is. Je mag er NIET vanuit gaan dat de lengte van $$\verb!x!$$ een geheel veelvoud is van het aantal rijen van $$\verb!C!$$.
Schrijf een tweede functie $$\verb!decodeer()!$$ met als argumenten de matrix die gebruikt werd voor de codering, en de gecodeerde vector. Het resultaat is de gedecodeerde versie van het tweede argument. Hierbij is de lengte van de vector nu uiteraard wel een geheel veelvoud van het aantal rijen van de codeermatrix.

Argumenten

Voor de functie $$\verb!codeer()!$$ : Een inverteerbare reële matrix als 2D NumPy-tabel (dus een array-type), $$n>0$$ rijen en $$n>0$$ kolommen, gevold door een te coderen vector, als NumPy-rij (1D).
Voor de functie $$\verb!decodeer()!$$ : Een inverteerbare reële matrix als 2D NumPy-tabel (dus een array-type), $$n>0$$ rijen en $$n>0$$ kolommen, gevold door een te decoderen vector, als NumPy-rij (1D).

Resultaat codeer()

Voor de functie $$\verb!codeer()!$$ : de gecodeerde versie van het tweede argument, als NumPy-rij (1D).
Voor de functie $$\verb!decodeer()!$$ : de gedecodeerde versie van het tweede argument, als NumPy-rij (1D).

Voorbeeld

C =  np.array([[ 0.,  1.,  2.,  3.], [-10., -17., -19., -15.], [25., 31., 9., 12.], [-7., -9., 12., 3.]]) 
x = np.array([1.0, 2.0, 1.0, 2.0, 7.0, 9.0, 1.0, 1.0, 3.0, 4.0, 10.0])
codeer(C, x) = 
	[  10.  -93.  120.   -7.   14. -257.  475. -115.   24. -288.  289.   63.]
decodeer(C, np.array([  10.,  -93.,  120.,   -7.,   14., -257.,  475., -115.,   24., -288.,  289.,   63.]) =
	[1.0 2.0 1.0 2.0 7.0 9.0 1.0 1.0 3.0 4.0 10.0 0.0]