Search
V této úloze budete mít za úkol implementovat maticové operace sčítání, odčítání a násobení. Všechny prvky všech matic (i v průběhu výpočtu) se vejdou do 32-bitového znaménkového typu integer.
Pokud nebude vstup ve správném formátu nebo nepůjde provést příslušnou maticovou operaci, tak vypiště “Error: Chybny vstup!” a konec řádku na standardní chybový výstup a ukončete program s návratovou hodnotou 100.
Error: Chybny vstup!
100
malloc()
calloc()
getline()
realloc()
Na standardním vstupu jsou pouze dvě matice s jednou operací (+,-,*). Vaším úkolem je provést zadanou operaci a vypsat na standardní výstup výslednou matici.
Na standardním vstupu jsou dvě nebo i více matic oddělených jedním řádkem se znakem operace (+,-,*). Každá matice má na prvním řádku nejprve svoji velikost ($n$, $m$) a následuje $n$ řádků vždy s $m$ hodnotami matice. Jednotlivé hodnoty jsou oddělené mezerami, ale za poslední hodnotou je pouze znak nového řádku.
Formát výstupu je stejný, ale obsahuje pouze jednu matici. Nezapomeňte, že na konci řádku není mezera a i za posledním řádkem je znak nového řádku.
$ \left( \begin{array}{cc} 76 & 98 & -31 \\ 30 & 30 & 32 \end{array} \right) - \left( \begin{array}{c} 89 & 25 & 38 \\ 1 & -32 & -38 \end{array} \right) = \left( \begin{array}{c} -13 & 73 & -69 \\ 29 & 62 & 70 \end{array} \right) $
2 3 76 98 -31 30 30 32 - 2 3 89 25 38 1 -32 -38
2 3 -13 73 -69 29 62 70
$ \left( \begin{array}{cc} -59 & 78 & -85\end{array} \right) \times \left( \begin{array}{c} 78 \\ -28 \\ -97\end{array} \right) = \left( \begin{array}{c} 1459\end{array} \right) $
1 3 -59 78 -85 * 3 1 78 -28 -97
1 1 1459
2 3 16 41 -98 * 3 1 96 -67 49
$ \left( \begin{array}{cc} 81 & -96 & -56 & -9 \\ -19 & 66 & 37 & -21 \\ 20 & 49 & -71 & -49 \\ 45 & -96 & 20 & 8\end{array} \right) \times \left( \begin{array}{c} -89 & -96 \\ 76 & 75 \\ 65 & 2\end{array} \right) $
4 4 81 -96 -56 -9 -19 66 37 -21 20 49 -71 -49 45 -96 20 8 * 3 2 -89 -96 76 75 65 2
Na vstupu je sekvence matic o maximální délce 100 spolu se zadanými operacemi. Operace vyhodnocujte podle jejich priority a vypište až výslednou matici. To odpovídá tomu, jako kdyby byl následující výraz s maticemi A až F:
$$ A + B * C + D * E - F$$
ozávorkován následujícím způsobem:
$$ A + (B * C) + (D * E) - F$$
$ \left( \begin{array}{cc} 6 & 4\end{array} \right) + \left( \begin{array}{cc} -6 & 7\end{array} \right) + \left( \begin{array}{cc} -6 & -4\end{array} \right) = \left( \begin{array}{cc} -6 & 7\end{array} \right) $
1 2 6 4 + 1 2 -6 7 + 1 2 -6 -4
1 2 -6 7
$ \left( \begin{array}{cc} 0 & 4 & -9 \\ -9 & 6 & -4 \\ 3 & 5 & -2 \\ -1 & 7 & 5\end{array} \right) \times \left( \begin{array}{cc} -10 & -9 & -8 & 9 \\ -4 & 0 & -9 & 1 \\ 4 & 6 & -9 & 5\end{array} \right) + \left( \begin{array}{cc} 0 & -9 & 3 & -6 \\ 10 & -9 & 8 & -7 \\ -1 & 0 & 5 & 1 \\ 3 & 2 & -9 & 9\end{array} \right) = \left( \begin{array}{cc} -52 & -63 & 48 & -47 \\ 60 & 48 & 62 & -102 \\ -59 & -39 & -46 & 23 \\ 5 & 41 & -109 & 32\end{array} \right) $
4 3 0 4 -9 -9 6 -4 3 5 -2 -1 7 5 * 3 4 -10 -9 -8 9 -4 0 -9 1 4 6 -9 5 + 4 4 0 -9 3 -6 10 -9 8 -7 -1 0 5 1 3 2 -9 9
4 4 -52 -63 48 -47 60 48 62 -102 -59 -39 -46 23 5 41 -109 32
2 2 3 x10 -9 5 + 2 2 8 -5 1 8 + 2 2 -4 6 -2 8
$ \left( \begin{array}{cc} -1 \\ 4\end{array} \right) + \left( \begin{array}{cc} -1 \\ 0\end{array} \right) + \left( \begin{array}{cc} 8 & 5 \\ 10 & -8\end{array} \right) \times \left( \begin{array}{cc} 5 \\ 5\end{array} \right) = \left( \begin{array}{cc} 63 \\ 14\end{array} \right) $
2 1 -1 4 + 2 1 -1 0 + 2 2 8 5 10 -8 * 2 1 5 5
2 1 63 14
Na vstupu jsou matice zadány ve formátu $název=[x11 \; x12 \; ... \; x1n; x21 \; x22 \; ... \; x2n; ... ; xm1 \; xm2 \; ... \; xmm]$ a maticová operace je poté zadána pomocí názvů jednotlivých matic.
$ B = \left( \begin{array}{cc} 5 & 2 & 4 \\ 0 & 2 & -1 \\ 3 & -5 & -4\end{array} \right),\;\;\; E = \left( \begin{array}{cc} -6 & -5 & -8 \\ -1 & -1 & -10 \\ 10 & 0 & -7\end{array} \right),\;\;\; R = \left( \begin{array}{cc} -1 & -7 & 6 \\ -2 & 9 & -4 \\ 6 & -10 & 2\end{array} \right) $
$ R + E + B = \left( \begin{array}{cc} -2 & -10 & 2 \\ -3 & 10 & -15 \\ 19 & -15 & -9\end{array} \right) $
B=[5 2 4; 0 2 -1; 3 -5 -4] E=[-6 -5 -8; -1 -1 -10; 10 0 -7] R=[-1 -7 6; -2 9 -4; 6 -10 2] R+E+B
[-2 -10 2; -3 10 -15; 19 -15 -9]
K=[-10 0 2; -6 10 -6; -9 2 0] D=[0 6 7] M=[10 -5 -4] D*K+M
[-89 69 -40]
R=[6 9; -3 9; -9 10] K=[2 -8 8; -1 2 -4] K+K*R*K
[-96 332 -384; 78 -252 312]
M=[-9 5 9; -7 8 7; 10 -3 3] M*M+M-M
[136 -32 -19; 77 8 14; -39 17 78]
…
Poslední veřejný příklad je inspirován jedním ze způsobů výpočtu Fibonacciho čísla. Výsledná matice bude obsahovat sumy prvních 24, 25 2) a 26 Fibonacciho čísel.
$$\sum_{i=1}^{25} A^i = \sum_{i=1}^{25}\left( \begin{array}{cc} 1 & 1 \\\\ 1 & 0\end{array} \right)^i$$
A=[1 1; 1 0] A+A*A+A*A*A+A*A*A*A+A*A*A*A*A+A*A*A*A*A*A+ ...
[317809 196417; 196417 121392]
Veřejné příklady + Makefile:
Dále obsahují zip soubory binární spustitelné soubory referenčního řešení hw05-test a hw05b-test, které lze použít pro ověření funkčnosti programu před jeho odevzdáním. Kromě přiložených testovacích vstupních souborů je doporučeno vytvořit si další testovací vstupy.
hw05-test
hw05b-test