예제 #1
0
        // 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);
        }
예제 #2
0
        //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);
        }
예제 #3
0
        //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);
        }
예제 #4
0
        // 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);
        }
예제 #5
0
        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;
            }
        }
예제 #6
0
        //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);
        }
예제 #7
0
        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!");
                }
            }
        }
예제 #8
0
        // 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);
        }
예제 #9
0
        // 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);
        }
예제 #10
0
        // 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);
        }
예제 #11
0
        //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);
        }
예제 #12
0
        // 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);
        }