Vaatleme näiteid maatriksite kohta.
Põhitehted on siin
/** N2ited maatriksitega imperatiivses stiilis. */
public class Maatr {
/** Peameetod silumiseks. */
public static void main (String[] s) {
int[][] a = new int[][]{ {5, 2, 4}, {0, 1, 5}, {1, 0, 1} };
System.out.println ("Maatriks A: " + soneKuju (a));
int[][] b = new int[][]{ {2, 8, 0}, {5, 3, 1}, {7, 4, 6} };
System.out.println ("Maatriks B: " + soneKuju (b));
int[][] c = summa (a, b);
System.out.println ("A + B: " + soneKuju (c));
int[][] d = korrutis (a, b);
System.out.println ("A * B: " + soneKuju (d));
System.out.println ("B minReaMax on: " + minReaMax (b));
System.out.println ("B maxReaMin on: " + maxReaMin (b));
System.out.println ("B minVeeruMax on: " + minVeeruMax (b));
System.out.println ("B maxVeeruMin on: " + maxVeeruMin (b));
if (minReaMax (a) == maxVeeruMin (a))
System.out.println ("A alumine sadulpunkt on: " + minReaMax (a));
else
System.out.println ("A-l ei ole alumist sadulpunkti");
if (maxReaMin (a) == minVeeruMax (a))
System.out.println ("A ylemine sadulpunkt on: " + maxReaMin (a));
else
System.out.println ("A-l ei ole ylemist sadulpunkti");
} // main
/** Teisendus s6neks. */
public static String soneKuju (int[][] m) {
String nl = System.getProperty ("line.separator");
StringBuffer sb = new StringBuffer(nl);
for (int i=0; i<m.length; i++) {
for (int j=0; j<m[i].length; j++) {
sb.append (String.valueOf (m[i][j]));
sb.append ("\t");
}
sb.append (nl);
}
return sb.toString();
} // soneKuju
/** Maatriksite liitmine. */
public static int[][] summa (int[][] m1, int[][] m2) {
if (m1.length != m2.length)
throw new RuntimeException ("ei saa liita");
int[][] res = new int [m1.length][];
for (int i=0; i<m1.length; i++) {
if (m1[i].length != m2[i].length)
throw new RuntimeException ("ei saa liita");
res[i] = new int [m1[i].length];
for (int j=0; j<m1[i].length; j++) {
res[i][j] = m1[i][j] + m2[i][j];
}
}
return res;
} // summa
/** Maatriksite korrutamine. */
public static int[][] korrutis (int[][] m1, int[][] m2) {
int m = m1.length;
int p = m1[0].length;
int n = m2[0].length;
if (p != m2.length)
throw new RuntimeException ("Ei saa korrutada");
int[][] res = new int[m][n];
for (int i=0; i<m; i++) {
for (int j=0; j<n; j++) {
res[i][j] = 0;
for (int k=0; k<p; k++) {
res[i][j] += m1[i][k]*m2[k][j];
}
}
}
return res;
} // korrutis
/** Maksimaalne element ridade miinimumide hulgas. */
public static int maxReaMin (int[][] m) {
int result = Integer.MIN_VALUE; // l6pptulemuse algv22rtus
// Tsykkel yle ridade
for (int i=0; i<m.length; i++) {
int rMin = Integer.MAX_VALUE; // jooksva rea miinimum
for (int j=0; j<m[i].length; j++) {
if (rMin > m[i][j]) rMin = m[i][j];
} // for j
if (result < rMin) result = rMin;
} // for i
return result;
} // maxReaMin
/** Minimaalne element ridade maksimumide hulgas. */
public static int minReaMax (int[][] m) {
int result = Integer.MAX_VALUE; // l6pptulemuse algv22rtus
// Tsykkel yle ridade
for (int i=0; i<m.length; i++) {
int rMax = Integer.MIN_VALUE; // jooksva rea maksimum
for (int j=0; j<m[i].length; j++) {
if (rMax < m[i][j]) rMax = m[i][j];
} // for j
if (result > rMax) result = rMax;
} // for i
return result;
} // minReaMax
/** Maksimaalne element veergude miinimumide hulgas. */
public static int maxVeeruMin (int[][] m) {
int result = Integer.MIN_VALUE; // l6pptulemuse algv22rtus
// Tsykkel yle veergude
for (int j=0; j<m[0].length; j++) {
int vMin = Integer.MAX_VALUE; // jooksva veeru miinimum
for (int i=0; i<m.length; i++) {
if (vMin > m[i][j]) vMin = m[i][j];
} // for i
if (result < vMin) result = vMin;
} // for j
return result;
} // maxVeeruMin
/** Minimaalne element veergude maksimumide hulgas.
* Lubatud erineva pikkusega read.
*/
public static int minVeeruMax (int[][] m) {
int result = Integer.MAX_VALUE; // l6pptulemuse algv22rtus
// teeme kindlaks maksimaalse reapikkuse vArv
int vArv = 0;
for (int i=0; i<m.length; i++) {
if (vArv < m[i].length) vArv = m[i].length;
}
// hoiame veergude maksimume massiivis vMax
int[] vMax = new int [vArv];
for (int j=0; j<vArv; j++) vMax[j]=Integer.MIN_VALUE;
// arvutame maksimumid
for (int i=0; i<m.length; i++) {
for (int j=0; j<m[i].length; j++) {
if (vMax[j] < m[i][j]) vMax[j] = m[i][j];
}
}
// leiame minimaalse
for (int j=0; j<vArv; j++) {
if (vMax[j] < result) result = vMax[j];
} // for j
return result;
} // minVeeruMax
} // Maatr
Tulemus
Maatriks A:
5 2 4
0 1 5
1 0 1
Maatriks B:
2 8 0
5 3 1
7 4 6
A + B:
7 10 4
5 4 6
8 4 7
A * B:
48 62 26
40 23 31
9 12 6
B minReaMax on: 5
B maxReaMin on: 4
B minVeeruMax on: 6
B maxVeeruMin on: 3
A alumine sadulpunkt on: 1
A ylemine sadulpunkt on: 2
Tegelikult oleks parem läheneda objektorienteeritud stiilis.
/** T2isarvude maatriks.
* @author Jaanus Poial
*/
public class Maatriks {
/** Peameetod muude
testimiseks. */
public static void
main (String[] a) {
Maatriks m1 = new Maatriks (new int [][] { {4, 9, 2}, {0, 7, 4} } );
Maatriks m2 = new Maatriks (3, 4);
m2.set (0, 0, 1);
m2.set (1, 1, 1);
m2.set (2, 2, 1);
Maatriks m3 = null;
System.out.println (m1);
System.out.println (m2);
System.out.println (m1.korda (m2));
try {
m3
= (Maatriks)m1.clone();
}
catch (CloneNotSupportedException e) {};
m1.set (0, 0, 1);
System.out.println (m1.pluss (m3));
//
v6rdsuse ja identsuse testid
Maatriks p1 = new Maatriks (new int[][]{ {1, 2}, {3, 4}});
Maatriks p2 = p1;
System.out.println (p2.equals
(p1)); // true
System.out.println (p2 ==
p1);
//
true
p2.set (0, 0, 7);
System.out.println (p2.equals
(p1)); // true
System.out.println (p2 ==
p1);
//
true
try {
p2
= (Maatriks)p1.clone();
}
catch (CloneNotSupportedException e) {};
System.out.println (p2.equals
(p1)); // true
System.out.println (p2 ==
p1);
//
false
p2.set (0, 0, 5);
System.out.println (p2.equals
(p1)); // false
System.out.println (p2 ==
p1);
//
false
} // main
/** maatriksi sisu */
private int[][]
massiiv;
/** Nullmaatriksi
konstruktor. */
Maatriks (int ridu,
int veerge) {
if
(ridu<1)
massiiv
= null;
else if (veerge<1)
massiiv
= null;
else {
//
m2lu eraldamine
massiiv
= new int [ridu] [veerge];
//
massiivi nullimine
for
(int i=0; i<massiiv.length; i++) {
for
(int j=0; j<massiiv[i].length; j++) {
massiiv
[i][j] = 0;
}
}
}
// else
} // konstruktor
/** Maatriksi
konstruktor etteantud massiivist. */
Maatriks (int[][]
mat) {
if
(mat == null)
massiiv
= null;
else if (mat.length<1)
massiiv
= null;
else if (mat[0].length<1)
massiiv
= null;
else {
massiiv
= new int [mat.length][mat[0].length];
for
(int i=0; i<mat.length; i++) {
for
(int j=0; j<mat[0].length; j++) {
massiiv
[i][j] = mat [i][j];
}
}
}
// else
} // konstruktor
/** Elemendi
kirjutamine maatriksisse. */
public int set (int
i, int j, int element) {
int res = massiiv [i][j];
massiiv [i][j] = element;
return res;
} // set
/** Elemendi
lugemine maatriksist. */
public int get (int
i, int j) {
return massiiv [i][j];
} // get
/** Teisendus
s6neks. */
public String
toString() {
StringBuffer res = new StringBuffer();
String nl = System.getProperty ("line.separator");
for (int i=0; i<massiiv.length; i++) {
for
(int j=0; j<massiiv[0].length; j++) {
res.append
(String.valueOf (massiiv [i][j]) + "\t");
}
res.append
(nl);
}
return res.toString();
} // toString
/** Koopia loomine.
*/
public Object
clone() throws CloneNotSupportedException {
return new Maatriks (massiiv);
} // clone
/** Kahe maatriksi
v6rdsuse tuvastamine. */
public boolean
equals (Object o) {
if
(o == null)
return
false;
int[][] om = ((Maatriks)o).massiiv;
if
(massiiv.length != om.length)
return
false;
for (int i=0; i<massiiv.length; i++) {
if
(massiiv[i].length != om[i].length)
return
false;
for
(int j=0; j<massiiv[i].length; j++) {
if
(massiiv [i][j] != om[i][j])
return
false;
}
}
return true;
} // equals
/** Maatriksite
korrutamine. */
public Maatriks
korda (Maatriks mat) {
if
(mat == null)
return
null;
if
(massiiv[0].length != mat.massiiv.length)
throw
new RuntimeException ("valed m66tmed korrutamisel");
Maatriks res = new Maatriks (massiiv.length, mat.massiiv[0].length);
for (int i=0; i<massiiv.length; i++) {
for
(int j=0; j<mat.massiiv[0].length; j++) {
res.massiiv [i][j] = 0;
for
(int k=0; k<mat.massiiv.length; k++) {
res.massiiv
[i][j] += massiiv [i][k]*mat.massiiv [k][j];
}
}
}
return res;
} // korda
/** Maatriksite
liitmine (vajadusel t2iendatud nullidega). */
public Maatriks
pluss (Maatriks mat) {
if
(mat == null)
return
new Maatriks (massiiv);
Maatriks res = new Maatriks
(Math.max
(massiiv.length, mat.massiiv.length),
Math.max
(massiiv[0].length, mat.massiiv[0].length));
for (int i=0; i<massiiv.length;
i++) {
for
(int j=0; j<massiiv[i].length; j++) {
res.massiiv
[i][j] = massiiv [i][j];
}
}
for
(int i=0; i<mat.massiiv.length; i++) {
for
(int j=0; j<mat.massiiv[i].length; j++) {
res.massiiv
[i][j] += mat.massiiv [i][j];
}
}
return res;
} // pluss
} // Maatriks
Transponeerimine kahel viisil:
/** Transponeerimine samale
kohale. */
public static void
transponeeri (double[][] maatriks) {
if
(maatriks == null) return;
int x = maatriks.length;
if
(x == 0) throw new IllegalArgumentException ("tyhi maatriks!");
int y = maatriks [0].length;
if
(y != x) throw new IllegalArgumentException ("ei ole ruutmaatriks!");
double
tmp; // vahetamiseks
for (int i=0; i<x; i++) {
for
(int j=0; j<i; j++) {
tmp
= maatriks [i][j];
maatriks
[i][j] = maatriks [j][i];
maatriks
[j][i] = tmp;
}
}
} // transponeeri
/**
Transponeerimine uude maatriksisse. */
public static
double[][] transp (double[][]
maatriks) {
if
(maatriks == null) return null;
int x = maatriks.length;
if
(x == 0) throw new IllegalArgumentException ("tyhi maatriks!");
int y = maatriks [0].length;
if
(y == 0) throw new IllegalArgumentException ("tyhi rida!");
double[][]
result = new double [y][x];
for (int i=0; i<y; i++) {
for
(int j=0; j<x; j++) {
result [i][j] = maatriks [j][i];
}
}
return result;
} // transp