Práce s maticemi
Práci s poli ilustrujme na jednoduchém příkladu maticových výpočtů. Implementujme třídu Matice, která bude matici ukládat do 2D pole. Pro základní operace s maticemi vytvořme třídu Operace, která bude sčítat dvě matice. Další výpočty (transpozice, součin) by bylo možno realizovat obdobným způsobem, z důvodu jednoduchosti je však nebudeme uvádět.public class Matice
{
private double [][] pole;
private int m, n;
Matice (double [][] p)
{
this.m=p.length;
this.n=p[0].length;
pole=new double[m][n];
for (int i=0; i<m;i++)
{
for (int j=0;i<n;j++)
{
this.pole[i][j]=p[i][j];
}
}
}
}
Třída Matice obsahuje následující datové položky: počet řádků a sloupců matice představovaný proměnnými m, n, vlastní matici tvořenou 2D polem pole. Konstruktor je explicitní, předáváme mu odkaz na již vytvořené 2D pole, jehož obsah zkopírujeme po prvku do vytvářeného objektu. Při vytvoření nového objektu současně provedeme jeho inicializaci. šlo by použít i jednodušší variantu a inicializovat objekt pouze odkazem na pole.
public class Operace
{
public void Soucet(Matice a, Matice b, Matice c)
{
for (int i=0;i<a.lengt;i++)
{
for (int j=0; j<a[0].length;j++)
{
c[i]=a[i]+b[i];
}
}
}
}
Třída Operace má jednu metodu soucet() se 3 formálními parametry: první dva představují odkazy na obě vstupní matice, třetí parametr tvoří odkaz na výslednou matici. Nejprve vytvoříme dynamická pole představující matice, následně objekty představující matice. Tento přístup je sice poněkud těžkopádný,
vyplývá však z toho, že každou z matic chceme inicializovat explicitně.
public static void main (String [] args)
{
//Vytvoreni poli
double [][] m1={{1,2,3},{4,5,6}};
double [][] m2={{1,0,1},{1,0,1}};
double [][] m3={{0,0,0},{0,0,0}};
//vytvoreni objektu
Matice A=new Matice(m1);
Matice B=new Matice(m2);
Matice B=new Matice(m2);
Operace o=new Operace();
//Soucet matic
o.Soucet(A,B,C);
}
Poté vytvoříme objekt třídy Operace, jako formální parametry mu předáme odkazy na objekty A, B, C. Následně bychom výslednou matici mohli např. vytisknout, do třídy Matice bychom mohli implementovat novou metodu realizující tuto operaci. Váše uvedený přístup je pouze ilustrativní, v praxi by bylo vhodné zamyslet se nad efektivnějším návrhem tříd a metod.
Autor: Filip Koval