// Transponiranje public Matrica VratiTransponiranuMatricu() { Matrica transponiranaMatrica = new Matrica(this.brojStupaca, this.brojRedaka); for (int i = 0; i < brojRedaka; i++) { for (int j = 0; j < brojStupaca; j++) { transponiranaMatrica[j, i] = this[i, j]; } } return(transponiranaMatrica); }
//Vraća kopiju matrice public Matrica VratiKopiju() { Matrica matricaKopija = new Matrica(brojRedaka, brojStupaca); for (int i = 0; i < brojRedaka; i++) { for (int j = 0; j < brojStupaca; j++) { matricaKopija[i, j] = this[i, j]; } } return(matricaKopija); }
//m3=m2*c (skalarno) public static Matrica operator *(Matrica m2, double skalar) { Matrica m3 = new Matrica(m2.brojRedaka, m2.brojStupaca); for (int i = 0; i < m2.brojRedaka; i++) { for (int j = 0; j < m2.brojStupaca; j++) { m3[i, j] = m2[i, j] * skalar; } } return(m3); }
// Učitavanje iz datoteke static public Matrica UcitajIzDatoteke(string adresaDatoteke) { List <double> listaUcitanihBrojeva = new List <double>(); string ucitaniRedak; int brojRedaka = 0, brojStupaca = 0, provjeraBrojaStupaca = 0; StreamReader citac = null; citac = new StreamReader(adresaDatoteke); while ((ucitaniRedak = citac.ReadLine()) != null) { brojRedaka++; foreach (string element in ucitaniRedak.Split(' ', '\t')) { try { listaUcitanihBrojeva.Add(double.Parse(element)); } catch { throw new Exception("Element matrice koju pokušavate iščitati iz datoteke nije broj!"); } provjeraBrojaStupaca++; } if (brojRedaka == 1) { brojStupaca = listaUcitanihBrojeva.Count; } else { if (provjeraBrojaStupaca != brojStupaca) { throw new Exception("Matrica nije učitana. Neispravno zadan oblik matrice u datoteci " + adresaDatoteke + "!"); } } provjeraBrojaStupaca = 0; } citac.Close(); Matrica matrica = new Matrica(brojRedaka, brojStupaca); for (int i = 0; i < brojRedaka; i++) { for (int j = 0; j < brojStupaca; j++) { matrica[i, j] = listaUcitanihBrojeva[i * brojStupaca + j]; } } return(matrica); }
private void btnLUP_Click(object sender, EventArgs e) { txtRezultati.Text = ""; try { if ((object)A == null) { throw new Exception("Potrebno je učitati matricu A!"); } if ((object)b == null) { throw new Exception("Potrebno je učitati vektor b!"); } if (A.brojRedaka != b.brojRedaka) { throw new Exception("Dimenzije matrice i vektora nisu kompatibilne za nastavak LUP dekompozicije!"); } Matrica permVektor; Matrica Adek = A.DekompozicijaLUP(out permVektor); /**/ txtRezultati.Text += "LUP Dekompozicija matrice A" + nl; /**/ txtRezultati.Text += Adek.ToString() + nl; /**/ txtRezultati.Text += "Matrica L" + nl; /**/ txtRezultati.Text += Adek.VratiMatricuL().ToString() + nl; /**/ txtRezultati.Text += "Matrica U" + nl; /**/ txtRezultati.Text += Adek.VratiMatricuU().ToString() + nl; /**/ txtRezultati.Text += "Permutacijski vektor" + nl; /**/ txtRezultati.Text += permVektor.ToString() + nl; /**/ txtRezultati.Text += "Vektor y' nakon permutacije" + nl; /**/ txtRezultati.Text += b.VratiPermutiraniVektor(permVektor).ToString() + nl; Matrica y_ = Adek.SupstitucijaUnaprijed(b.VratiPermutiraniVektor(permVektor)); /**/ txtRezultati.Text += "Vektor y' nakon supstitucije unaprijed" + nl; /**/ txtRezultati.Text += y_.ToString(); x = Adek.SupstitucijaUnatrag(y_); /**/ txtVektorX.Text = x.ToString(); /**/ txtRezultati.Text += nl + "Sustav ima rješenje!"; } catch (Exception ex) { txtRezultati.Text += "Proces rješavanja zaustavljen!!" + nl; txtRezultati.Text += ex.Message; } }
//m3=m1-m2 public static Matrica operator -(Matrica m1, Matrica m2) { // provjere dimenzija if ((m1.brojRedaka != m2.brojRedaka) || (m1.brojStupaca != m2.brojStupaca)) { throw new Exception("Matrice nisu kompatibilne za oduzimanje!"); } Matrica m3 = new Matrica(m1.brojRedaka, m1.brojStupaca); for (int i = 0; i < m1.brojRedaka; i++) { for (int j = 0; j < m1.brojStupaca; j++) { m3[i, j] = m1[i, j] - m2[i, j]; } } return(m3); }
private void btnUcitajA_Click(object sender, EventArgs e) { OpenFileDialog ofd = new OpenFileDialog(); ofd.Filter = "Tekstualna datoteka|*.txt"; ofd.Title = "Odaberite matricu A"; if (ofd.ShowDialog() == DialogResult.OK) { try { A = Matrica.UcitajIzDatoteke(ofd.FileName); txtMatricaA.Text = A.ToString(); } catch (Exception ex) { MessageBox.Show(ex.Message, "Greška!"); } } }
// Iz LU matrice očitava i vraća matricu U public Matrica VratiMatricuU() { Matrica matricaU = new Matrica(brojRedaka, brojStupaca); for (int i = 0; i < brojRedaka; i++) { for (int j = 0; j < brojStupaca; j++) { if (i <= j) { matricaU[i, j] = this[i, j]; } else { matricaU[i, j] = 0; } } } return(matricaU); }
// LUP Dekompozicija () public Matrica DekompozicijaLUP(out Matrica permutacijskiVektor) { permutacijskiVektor = new Matrica(1, brojRedaka); Matrica radnaMatrica = this.VratiKopiju(); for (int i = 0; i < brojRedaka; i++) { permutacijskiVektor[0, i] = i; } for (int i = 0; i < brojRedaka - 1; i++) { int pivot = i; for (int j = i + 1; j < brojRedaka; j++) { if (Math.Abs(radnaMatrica[j, i]) > Math.Abs(radnaMatrica[pivot, i])) { pivot = j; } } if (Math.Abs(radnaMatrica[pivot, i]) < Matrica.konstantaUsporedbe) { throw new Exception("LUP dekompozicija je zaustavljena jer je detektiran stožerni element manji od zadane granice!"); } radnaMatrica = radnaMatrica.ZamijeniRetke(i, pivot); permutacijskiVektor = permutacijskiVektor.ZamijeniStupce(i, pivot); for (int j = i + 1; j < brojRedaka; j++) { radnaMatrica[j, i] /= radnaMatrica[i, i]; for (int k = i + 1; k < brojRedaka; k++) { radnaMatrica[j, k] -= radnaMatrica[j, i] * radnaMatrica[i, k]; } } } //if (Math.Abs(radnaMatrica[brojRedaka - 1, brojStupaca - 1]) < konstantaUsporedbe) // throw new Exception("LUP dekompozicija je zaustavljena jer je detektiran stožerni element manji od zadane granice!"); return(radnaMatrica); }
// Supstitucija unaprijed public Matrica SupstitucijaUnaprijed(Matrica b) { if (b.brojStupaca > 1) { throw new Exception("Ulazni parametar supstitucije unaprijed mora biti ''okomiti'' vektor (dimenzija nx1)!"); } if (b.brojRedaka != this.brojRedaka) { throw new Exception("Ulazni vektor supstitucije unaprijed nije valjane dimenzije!"); } Matrica vektorY = b.VratiKopiju(); for (int i = 0; i < brojRedaka - 1; i++) { for (int j = i + 1; j < brojRedaka; j++) { vektorY[j, 0] -= this[j, i] * vektorY[i, 0]; } } return(vektorY); }
//m3=m1*m2 (matrično) public static Matrica operator *(Matrica m1, Matrica m2) { // provjere dimenzija if (m1.brojStupaca != m2.brojRedaka) { throw new Exception("Matrice nisu kompatibilne za množenje!"); } Matrica m3 = new Matrica(m1.brojRedaka, m2.brojStupaca); for (int i = 0; i < m1.brojRedaka; i++) { for (int j = 0; j < m2.brojStupaca; j++) { m3[i, j] = 0; for (int k = 0; k < m1.brojStupaca; k++) { m3[i, j] += m1[i, k] * m2[k, j]; } } } return(m3); }
// Iz LU matrice očitava i vraća matricu L public Matrica VratiMatricuL() { Matrica matricaL = new Matrica(brojRedaka, brojStupaca); for (int i = 0; i < brojRedaka; i++) { for (int j = 0; j < brojStupaca; j++) { if (i == j) { matricaL[i, j] = 1; } else if (i > j) { matricaL[i, j] = this[i, j]; } else { matricaL[i, j] = 0; } } } return(matricaL); }