public Matrici ridicarelaputere(Matrici a, int p) { Matrici rez = a; while (p > 1) { a = a.inmultire(rez); p--; } return(a); }
public Matrici adunare(Matrici a) { if (a.n == this.n && a.m == this.m) { Matrici rez = new Matrici(n, m); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { rez.mat[i, j] = mat[i, j] + a.mat[i, j]; } } return(rez); } else { Console.WriteLine("Matricile nu se pot aduna. Nu au aceeasi dimensiune."); return(null); } }
public Matrici inmultire(Matrici a) { if (a.n == m) { Matrici rez = new Matrici(n, a.m); for (int i = 0; i < n; i++) { for (int j = 0; j < a.m; j++) { rez.mat[i, j] = 0; for (int k = 0; k < m; k++) { rez.mat[i, j] += mat[i, k] * a.mat[k, j]; } } } return(rez); } else { Console.WriteLine("Matricile nu se pot inmulti."); return(null); } }
static void Main(string[] args) { Console.WriteLine("Prima matrice este:"); Matrici A = new Matrici(@"..\..\Matrice A.txt", true); foreach (string s in A.afisare()) { Console.WriteLine(s); } Console.WriteLine(); Console.WriteLine("A doua matrice este:"); Matrici B = new Matrici(@"..\..\Matrice B.txt", true); foreach (string s in B.afisare()) { Console.WriteLine(s); } Console.WriteLine(); Console.WriteLine("Adunarea matricilor este:"); Matrici C = A.adunare(B); foreach (string s in C.afisare()) { Console.WriteLine(s); } Console.WriteLine(); Console.WriteLine("Scaderea matricilor este:"); Matrici D = A.scadere(B); foreach (string s in D.afisare()) { Console.WriteLine(s); } Console.WriteLine(); Console.WriteLine("Inmultirea matricilor este:"); Matrici E = A.inmultire(B); foreach (string s in E.afisare()) { Console.WriteLine(s); } Console.WriteLine(); int p = 3; Console.WriteLine($"Ridicarea la puterea {p} a primei matrici este:"); Matrici F = A.ridicarelaputere(A, p); foreach (string s in F.afisare()) { Console.WriteLine(s); } Console.WriteLine(); Console.WriteLine($"Ridicarea la puterea {p} a celei de-a doua matrice este:"); Matrici G = B.ridicarelaputere(B, p); foreach (string s in G.afisare()) { Console.WriteLine(s); } Console.WriteLine(); Console.WriteLine($"Inversa primei matrici este:"); Matrici H = A.inversa(A); foreach (string s in H.afisare()) { Console.WriteLine(s); } Console.WriteLine(); Console.WriteLine($"Inversa a celei de-a doua matrice este:"); Matrici I = B.inversa(B); foreach (string s in I.afisare()) { Console.WriteLine(s); } Console.WriteLine(); }
public Matrici inversa(Matrici mat) { if (n == m) { double d = mat.determinant(this.mat, n); if (d != 0) { Matrici rez = new Matrici(n, n); Matrici temp = new Matrici(n, n); //matricea transpusa for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { temp.mat[i, j] = mat.mat[j, i]; } } double aux; int semn; //matricea adjuncta for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { //interschimb linia i cu ultima linie (n-1) for (int k = 0; k < n; k++) { aux = temp.mat[i, k]; temp.mat[i, k] = temp.mat[n - 1, k]; temp.mat[n - 1, k] = aux; } //si coloana j cu ultima coloana (n-1) for (int k = 0; k < n; k++) { aux = temp.mat[k, j]; temp.mat[k, j] = temp.mat[k, n - 1]; temp.mat[k, n - 1] = aux; } //stabilim semnul pentru permutarea liniilor si a //coloanelor in matrice semn = 1; if (((n - 1 - i) % 2 == 0) && (i != n - 1)) { semn *= -1; } if (((n - 1 - j) % 2 == 0) && (j != n - 1)) { semn *= -1; } if ((i + j) % 2 == 1) { semn *= -1; } rez.mat[i, j] = semn * determinant(temp.mat, n - 1); //refac matricea for (int k = 0; k < n; k++) { aux = temp.mat[i, k]; temp.mat[i, k] = temp.mat[n - 1, k]; temp.mat[n - 1, k] = aux; } for (int k = 0; k < n; k++) { aux = temp.mat[k, j]; temp.mat[k, j] = temp.mat[k, n - 1]; temp.mat[k, n - 1] = aux; } } } //matricea inversa for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { rez.mat[i, j] /= d; } } return(rez); } else { Console.WriteLine("Matricea nu este inversabila. Are determinantul nul."); return(null); } } else { Console.WriteLine("Matricea nu se poate inversa. Nu este patratica."); return(null); } }