namespace MatrixOperations
public static void Main()
Matrix X = new Matrix(new double[3, 3] { { 1,2,0}, { 0,2,3 }, { 1,0,3} });
Matrix kovar = new Matrix(~X);
Console.WriteLine("Коваріантна база:");
matrixE(kovar, new string[] { "e1", "e2", "e3" });
Matrix kontravar = new Matrix(Matrix.SLAR(new Matrix(kovar), new Vector(1, 0, 0)), Matrix.SLAR(new Matrix(kovar), new Vector(0, 1, 0)), Matrix.SLAR(new Matrix(kovar), new Vector(0, 0, 1)));
Console. WriteLine("контраваріантна база:");
matrixE(kontravar, new string[] { "e1", "e2", "e3" });
Console. WriteLine("метричні елементи:");
metriktenzor(kovar, new string[] { "e1", "e2", "e3" });
static void matrixE(Matrix matrix, string [] str)
for (int i = 0; i < matrix.N; i++)
for (int j = 0; j < matrix.M; j++)
Console.Write("+{1}", matrix[i, j], str[j]);
Console.Write("+{0}*{1}", matrix[i, j], str[j]);
else if (matrix[i, j] < 0)
Console.Write("-{1}", matrix[i, j], str[j]);
Console.Write("{0}*{1}", matrix[i, j], str[j]);
static void matrixE(Vector vector, string[] str)
for (int i = 0; i < vector.N; i++)
Console.Write("+{1}", vector[i], str[i]);
Console.Write("+{0}*{1}", vector[i], str[i]);
Console.Write("{1}", vector[i], str[i]);
Console.Write("{0}*{1}", vector[i], str[i]);
static void metriktenzor(Matrix kovar, string[] str)
for (int i = 0; i < kovar.N; i++)
for (int j = 0; j < kovar.M; j++)
Console.Write("g{0}{1}=R{0}*R{1}=(", i+1, j+1);
for (int k = 0; k < kovar.M; k++)
Console.Write("+{1}", kovar[i, k], str[k]);
Console.Write("+{0}*{1}", kovar[i, k], str[k]);
else if (kovar[i, k] < 0)
Console.Write("-{1}", kovar[i, k], str[k]);
Console.Write("{0}*{1}", kovar[i, k], str[k]);
for (int k = 0; k < kovar.M; k++)
Console.Write("+{1}", kovar[j, k], str[k]);
Console.Write("+{0}*{1}", kovar[j, k], str[k]);
else if (kovar[j, k] < 0)
Console.Write("-{1}", kovar[j, k], str[k]);
Console.Write("{0}*{1}", kovar[j, k], str[k]);
Console.WriteLine(")={0}", (new Vector(kovar[i])) * (new Vector(kovar[j])));
private double[][] matrix;
public int N { get; private set; }
public int M { get; private set; }
Matrix D = new Matrix(N, M);
for (int i = 0; i < D.N; i++)
for (int j = 0; j < D.M; j++)
if (i == j) D[i, j] = this[i, j];
Matrix E = new Matrix(N, M);
Matrix L = new Matrix(N, M);
for (int i = 0; i < L.N; i++)
for (int j = 0; j < L.M; j++)
if (i > j) L[i, j] = this[i, j];
Matrix R = new Matrix(N, M);
for (int i = 0; i < R.N; i++)
for (int j = 0; j < R.M; j++)
if (i < j) R[i, j] = this[i, j];
public Matrix(double[,] matr)
NEW(matr.GetLength(0), matr.Length / matr.GetLength(0));
for (int i = 0; i < N; i++)
for (int j = 0; j < M; j++)
public Matrix(int n, int m, Random rnd) : this(n, m)
for (int i = 0; i < N; i++)
for (int j = 0; j < M; j++)
this[i, j] = rnd.Next(0, 9);
public Matrix(int n, int m)
public Matrix(string way)
public Matrix(Matrix obj) : this(obj.N, obj.M)
for (int i = 0; i < N; i++)
for (int j = 0; j < M; j++)
public Matrix(params Vector[] obj) : this(obj.Length, obj[0].N)
for (int i = 0; i < N; i++)
for (int j = 0; j < M; j++)
public static Matrix operator +(Matrix A, Matrix B)
Matrix _matrix = new Matrix(A.N, A.M);
for (int i = 0; i < _matrix.N; i++)
for (int j = 0; j < _matrix.M; j++)
_matrix[i, j] = A[i, j] + B[i, j];
public static Matrix operator +(Matrix A, double scalar)
Matrix _matrix = new Matrix(A.N, A.M);
for (int i = 0; i < _matrix.N; i++)
for (int j = 0; j < _matrix.M; j++)
_matrix[i, j] = A[i, j] + scalar;
public static Matrix operator ++(Matrix A)
for (int i = 0; i < A.N; i++)
for (int j = 0; j < A.M; j++)
public static Matrix operator --(Matrix A)
for (int i = 0; i < A.N; i++)
for (int j = 0; j < A.M; j++)
public static Matrix operator -(Matrix A, Matrix B)
Matrix _matrix = new Matrix(A.N, A.M);
for (int i = 0; i < _matrix.N; i++)
for (int j = 0; j < _matrix.M; j++)
_matrix[i, j] = A[i, j] - B[i, j];
public static Matrix operator -(Matrix A, double scalar)
Matrix _matrix = new Matrix(A.N, A.M);
for (int i = 0; i < _matrix.N; i++)
for (int j = 0; j < _matrix.M; j++)
_matrix[i, j] = A[i, j] - scalar;
public static Matrix operator -(Matrix A)
Matrix _matrix = new Matrix(A.N, A.M);
for (int i = 0; i < _matrix.N; i++)
for (int j = 0; j < _matrix.M; j++)
_matrix[i, j] = -A[i, j];
public static Matrix operator *(Matrix A, Matrix B)
Matrix _matrix = new Matrix(A.N, B.M);
for (int i = 0; i < _matrix.N; i++)
for (int j = 0; j < _matrix.M; j++)
for (int k = 0; k < B.N; k++)
_matrix[i, j] += A[i, k] * B[k, j];
public static Matrix operator *(Matrix A, double scalar)
Matrix _matrix = new Matrix(A.N, A.M);
for (int i = 0; i < _matrix.N; i++)
for (int j = 0; j < _matrix.M; j++)
_matrix[i, j] = A[i, j] * scalar;
public static Matrix operator /(Matrix A, double scalar)
Matrix _matrix = new Matrix(A.N, A.M);
for (int i = 0; i < _matrix.N; i++)
for (int j = 0; j < _matrix.M; j++)
_matrix[i, j] = A[i, j] / scalar;
public static Matrix operator ^(Matrix A, double pow)
Matrix _matrix = new Matrix(A.N, A.M);
for (int i = 1; i < pow; i++)
public static Matrix operator ~(Matrix A)
Matrix _matrix = new Matrix(A.M, A.N);
for (int i = 0; i < _matrix.N; i++)
for (int j = 0; j < _matrix.M; j++)
public static bool operator <(Matrix A, Matrix B)
return A.NormMax() < B.NormMax();
public static bool operator >(Matrix A, Matrix B)
return A.NormMax() > B.NormMax();
public static implicit operator Vector(Matrix matrix)
Vector vector = new Vector(matrix);
public static implicit operator Matrix(Vector vector)
Matrix matrix = new Matrix(vector);
public double this[int i, int j]
if (i >= 0 && i < N && j >= 0 && j < M) return matrix[i][j];
if (i >= 0 && i < N && j >= 0 && j < M) matrix[i][j] = value;
public double[] this[int i]
if (i >= 0 && i < N) return matrix[i];
if (i >= 0 && i < N) matrix[i] = value;
for (int i = 0; i < N; i++)
for (int j = 0; j < M; j++)
Console.Write("Enter n= ");
N = Convert.ToInt32(Console.ReadLine());
Console.Write("Enter m= ");
M = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Enter matrix: ");
public void Fill(double lower, double diagonal, double upper)
for (int i = 0; i < this.N; i++)
for (int j = 0; j < this.M; j++)
if (i > j) this[i, j] = lower;
else if (i == j) this[i, j] = diagonal;
else if (i < j) this[i, j] = upper;
else Console.WriteLine("Error!!!");
public void NEW(int n, int m)
matrix = new double[n][];
for (int i = 0; i < n; i++) matrix[i] = new double[m];
public override string ToString()
for (int i = 0; i < N; i++)
for (int j = 0; j < M - 1; j++)
if (i < N - 1) result += "\n";
for (int i = 0; i < N; i++)
for (int j = 0; j < M; j++)
Console.Write("{0,-8}", matrix[i][j]);
public void Print(Vector A)
for (int i = 0; i < N; i++)
for (int j = 0; j < M; j++)
Console.Write("{0,-8}", matrix[i][j]);
public static Vector SLAR(Matrix A, Vector b)
for (int k = 0; k < n - 1; k++)
for (int i = k + 1; i < n; i++)
if (Math.Abs(A[Imax, k]) < Math.Abs(A[i, k]))
for (int i = 0; i < n; i++)
for (int i = k + 1; i < n; i++)
for (int j = 0; j < n; j++)
A[i, j] = A[i, j] - (C * A[k, j]);
b[i] = b[i] - (C * b[k]);
public static Vector X(Matrix A, Vector b)
Vector X = new Vector(n);
for (int j = n - 1; j >= 0; j--)
for (int k = n - 1; k > j; k--)
public static void Swap(ref double a, ref double b)
public int N { get; private set; }
Console.Write("Enter n= ");
N = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Enter vector: ");
public Vector(params double[] vect)
for (int i = 0; i < N; i++)
public Vector(string way)
public Vector(Vector obj) : this(obj.N)
for (int i = 0; i < N; i++)
public Vector(Matrix obj) : this(obj.N)
for (int i = 0; i < vector.Length; i++)
public static Vector operator +(Vector A, Vector B)
Vector _vector = new Vector(A.N);
for (int i = 0; i < _vector.N; i++)
_vector[i] = A[i] + B[i];
public static Vector operator +(Vector A, double scalar)
Vector _vector = new Vector(A.N);
for (int i = 0; i < _vector.N; i++)
_vector[i] = A[i] + scalar;
public static Vector operator +(Vector A)
Vector _vector = new Vector(A.N);
for (int i = 0; i < _vector.N; i++)
public static Vector operator ++(Vector A)
for (int i = 0; i < A.vector.Length; i++)
public static Vector operator --(Vector A)
for (int i = 0; i < A.N; i++)
public static Vector operator -(Vector A, Vector B)
Vector _vector = new Vector(A.N);
for (int i = 0; i < _vector.N; i++)
_vector[i] = A[i] - B[i];
public static Vector operator -(Vector A)
Vector _vector = new Vector(A.N);
for (int i = 0; i < _vector.N; i++)
public static Vector operator *(Vector A, Matrix B)
Vector _vector = new Vector(B.N);
for (int i = 0; i < B.N; i++)
for (int k = 0; k < A.N; k++)
_vector[i] += A[k] * B[i, k];
public static double operator *(Vector A, Vector B)
for (int i = 0; i < A.N; i++)
public static Vector operator *(Vector A, double scalar)
Vector _vector = new Vector(A.N);
for (int i = 0; i < _vector.N; i++)
_vector[i] = A[i] * scalar;
public static Vector operator /(Vector A, double scalar)
Vector _vector = new Vector(A.N);
for (int i = 0; i < _vector.N; i++)
_vector[i] = A[i] / scalar;
public static Matrix operator ^(Vector A, double pow)
Matrix _matrix = new Matrix(A.N, 1);
for (int i = 0; i < A.N; i++)
public double this[int i]
get { return vector[i]; }
for (int i = 0; i < N; i++)
return Math.Sqrt(length);
public void Fill(double value)
for (int i = 0; i < N; i++)
for (int i = 0; i < N; i++)
Console.Write("{0,-8}", this[i]);
public void Print(Matrix A)
for (int i = 0; i < N; i++)
for (int j = 0; j < A.N; j++)