dm.vpi.lekce04.matrix
Class Matrix

java.lang.Object
  extended by dm.vpi.lekce04.matrix.Matrix
All Implemented Interfaces:
java.lang.Cloneable

public class Matrix
extends java.lang.Object
implements java.lang.Cloneable

Třída Matrix realizuje abstraktní datový typ dvojrozměrná matice. Zapouzdřuje nejen data, ale také legální operace nad nimi.

Aby data zůstala po celou dobu používání v konzistentním stavu, je dobré se držet zásady, že uživatel třídy se k holým datům dostane výhradně přes rozhraní (API) realizované veřejnými metodami.

Třída implementuje rozhraní Cloneable, aby bylo možné překrýt metodu clone().

Author:
David Martinek

Field Summary
protected  int[][] m
          Zapouzdřená data představující dvojrozměrné pole -- matici.
 
Constructor Summary
Matrix(int[][] m)
          Kopírovací konstruktor, který vyrobí nový objekt se stejnými hodnotami jako zadané dvojrozměrné pole.
Matrix(int rows, int cols)
           Konstruktor - volá se pomocí operátoru new.
 
Method Summary
private  Matrix add(int[][] m)
          Přičte obsah zadané matice k aktuální matici.
 Matrix add(Matrix m)
          Přičte obsah zadané matice k aktuální matici.
 Matrix addConst(int k)
          Přičte ke každému prvku matice konstantu.
 java.lang.Object clone()
          Klonovací metoda - vytvoří identickou kopii objektu.
protected  void create(int rows, int cols)
           Alokuje paměť pro pole.
static Matrix createEMatrix(int size)
           Vyrobí jednotkovou čtvercovou matici zadaného rozměru.
static Matrix createRandomMatrix(int rows, int cols)
          Vyrobí matici zadaných rozměrů a naplní ji náhodnými hodnotami.
 boolean equals(java.lang.Object obj)
           Porovná dva objekty.
 int getCols()
          Vrátí počet sloupců matice.
static Matrix getProduct(Matrix a, Matrix b)
          V případě, že tato operace má smysl, vynásobí dvě matice (a * b) a vrátí výsledný součin jako novou matici (c).
 int getRows()
          Vrací počet řádků matice.
static void main(java.lang.String[] args)
          Metoda main zde slouží pouze pro testování.
 Matrix mult(Matrix x)
          Vynásobí aktuální matici zadanou maticí a vrátí výsledek jako novou matici.
 Matrix multConst(int k)
          Vynásobí matici konstantou.
 void print(java.io.PrintStream stream)
          Vytiskne matici na zadaný výstupní proud.
private  Matrix setValue(int[][] m)
          Zkopíruje hodnoty zadané matice do sebe.
 Matrix setValueOf(Matrix m)
           Zkopíruje hodnoty zadané matice do sebe.
private  Matrix sub(int[][] m)
          Odečte obsah zadané matice od aktuální matice.
 Matrix sub(Matrix m)
          Odečte obsah zadané matice od aktuální matice.
 Matrix transpose()
          Provede transpozici matice.
 
Methods inherited from class java.lang.Object
finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

m

protected int[][] m
Zapouzdřená data představující dvojrozměrné pole -- matici.

Constructor Detail

Matrix

public Matrix(int rows,
              int cols)

Konstruktor - volá se pomocí operátoru new. Vytváří a zároveň inicializuje novou instanci třídy - objekt.

Nelze vyrobit matici nelegálních rozměrů (záporný rozměr), protože Java hlídá meze polí (narozdíl od C, C++) a v tomto případě by to vyhodilo výjimku NegativeArraySizeException.

Parameters:
rows - Počet řádků matice.
cols - Počet sloupců matice.

Matrix

public Matrix(int[][] m)
Kopírovací konstruktor, který vyrobí nový objekt se stejnými hodnotami jako zadané dvojrozměrné pole.

Parameters:
m - Referenční dvojrozměrné pole.
Method Detail

create

protected void create(int rows,
                      int cols)

Alokuje paměť pro pole. Tento kód je odsunut do samostatné metody, protože jej využívá více konstruktorů. Když v budoucnu vznikne potřeba provádět alokaci složitějším způsobem, bude možné to provést zde na jediném místě. Kdyby se stejný kód nacházel ve více metodách, bylo by obtížné takovou úpravu provést konzistentně.

Metoda je označena jako protected, aby ji mohli využívat případní potomci této třídy. Zároveň ale netvoří rozhraní třídy, takže pro běžného uživatele je neviditelná.

Parameters:
rows - Počet řádků matice.
cols - Počet sloupců matice.

createEMatrix

public static Matrix createEMatrix(int size)

Vyrobí jednotkovou čtvercovou matici zadaného rozměru.

Statickým metodám, které vytvářejí objekty určitých vlastností se také říká tovární metody.

Parameters:
size - Rozměr vyráběné čtvercové matice.
Returns:
Vrací referenci na novou matici.

createRandomMatrix

public static Matrix createRandomMatrix(int rows,
                                        int cols)
Vyrobí matici zadaných rozměrů a naplní ji náhodnými hodnotami.

Parameters:
rows - Počet řádků nové matice.
cols - Počet sloupců nové matice.
Returns:
Vrací referenci na novou matici.

getRows

public int getRows()
Vrací počet řádků matice.

Returns:
Počet řádků matice

getCols

public int getCols()
Vrátí počet sloupců matice. Na této metodě je pěkně vidět, proč je dobré vytvářet k datům přístup pouze přes rozhraní tvořené veřejnými metodami. Kdyby měl uživatel přístup přímo k 2D poli, mohl by na kontrolu mezí zapomenout.

Returns:
Počet sloupců matice.

setValueOf

public Matrix setValueOf(Matrix m)
                  throws IncompatibleMatrixException

Zkopíruje hodnoty zadané matice do sebe. Pokud zadaná matice nemá stejné rozměry jako aktuální objekt, funkce vyhodí výjimku. Tato metoda volá jinou privátní metodu, která dělá vlastní akci.

Tato metoda slouží jako rozhraní směrem k uživateli, proto provádí kontrolu parametrů - v případě, že nesplňují požadované podmínky, metoda vyhazuje výjimku. V privátní metodě se kvůli efektivitě tyto kontroly už neprovádějí, protože se předpokládá, že autor této třídy vše odladil. Veřejné metodě, která sama nic nedělá se říká obalovací metoda.

Parameters:
m - Matice, jejíž hodnoty se budou kopírovat.
Returns:
Vrací referenci na sebe sama.
Throws:
IncompatibleMatrixException

setValue

private Matrix setValue(int[][] m)
Zkopíruje hodnoty zadané matice do sebe. Z důvodu vyšší efektivity tato metoda neprodukuje žádnou výjimku. Je ale vhodné v tomto případě použít assert (protože jde o privátní metodu, můžeme si to dovolit, u veřejné metody musíme vyhazovat výjimky - proč asi?).

Parameters:
m - Matice, jejíž hodnoty se budou kopírovat.
Returns:
Vrací referenci na sebe sama.

add

public Matrix add(Matrix m)
           throws IncompatibleMatrixException
Přičte obsah zadané matice k aktuální matici.

Parameters:
m - Přičítaná matice.
Returns:
Vrací referenci na sebe sama.
Throws:
IncompatibleMatrixException - Generuje výjimku v případě, že matice nejsou rozměrově kompatibilní.

add

private Matrix add(int[][] m)
Přičte obsah zadané matice k aktuální matici.

Parameters:
m - Přičítaná matice.
Returns:
Vrací referenci na sebe sama.

addConst

public Matrix addConst(int k)
Přičte ke každému prvku matice konstantu.

Parameters:
k - Konstanta.
Returns:
Vrací referenci na sebe sama.

sub

public Matrix sub(Matrix m)
           throws IncompatibleMatrixException
Odečte obsah zadané matice od aktuální matice.

Parameters:
m - Odečítaná matice.
Returns:
Vrací referenci na sebe sama.
Throws:
IncompatibleMatrixException - Generuje výjimku v případě, že matice nejsou rozměrově kompatibilní.

sub

private Matrix sub(int[][] m)
Odečte obsah zadané matice od aktuální matice.

Parameters:
m - Odečítaná matice.
Returns:
Vrací referenci na sebe sama.

multConst

public Matrix multConst(int k)
Vynásobí matici konstantou.

Parameters:
k - Multiplikační konstanta.
Returns:
Vrací referenci na sebe sama.

getProduct

public static Matrix getProduct(Matrix a,
                                Matrix b)
                         throws IncompatibleMatrixException
V případě, že tato operace má smysl, vynásobí dvě matice (a * b) a vrátí výsledný součin jako novou matici (c).

Parameters:
a - Matice na prvním místě.
b - Matice na druhém místě.
Returns:
Vrací referenci na novou matici.
Throws:
IncompatibleMatrixException - Generuje výjimku, pokud operace násobení nemá na zadaných maticích smysl.

mult

public Matrix mult(Matrix x)
            throws IncompatibleMatrixException
Vynásobí aktuální matici zadanou maticí a vrátí výsledek jako novou matici. Aktuální i zadaná matice zůstanou neporušeny. Provede se tato operace: c = this * x, přičemž c je návratová hodnota.

Parameters:
x - Matice na druhém místě.
Returns:
Vrací referenci na novou matici.
Throws:
IncompatibleMatrixException - Generuje výjimku, pokud operace násobení nemá na daných maticích smysl.

transpose

public Matrix transpose()
Provede transpozici matice.

Returns:
Vrací referenci na sebe sama.

print

public void print(java.io.PrintStream stream)
Vytiskne matici na zadaný výstupní proud.

Parameters:
stream - Výstupní proud, do kterého se bude tisknout obsah matice.

clone

public java.lang.Object clone()
Klonovací metoda - vytvoří identickou kopii objektu. Tato metoda překrývá implicitní implementaci ze třídy Object. Aby tato metoda fugovala správně, je nutné, aby tato třída implementovala rozhraní Cloneable. Dále je důležité, aby vytvořila skutečně hlubokou kopii tohoto objektu. Kdyby vytvářela pouze mělkou kopii (tj. kopírovala by například reference, místo alokace nových objektů), velmi pravděpodobně by to způsobovalo závažné a záludné chyby.

Overrides:
clone in class java.lang.Object

equals

public boolean equals(java.lang.Object obj)

Porovná dva objekty. Během porovnávání provádí porovnání prvek po prvku. Pokud chce programátor v Javě porovnávat dva objekty, nemůže k tomu použít operátor ==, protože ten porovnává pouze reference (tedy adresy) a ne skutečný obsah objektů.

Tato metoda je zděděná ze třídy Object.

Overrides:
equals in class java.lang.Object
See Also:
Object.equals(java.lang.Object)

main

public static void main(java.lang.String[] args)
Metoda main zde slouží pouze pro testování. Pro výslednou aplikaci nemá význam.