Работа с матрицами на C#. Продолжение.
Единичная матрица
Единичная матрица — это квадратная матрица, на главной диагонали которой все элементы равны 1, а все остальные элементы равны 0.
Для создания такой матрицы добавим статический метод
public static Matrix CreateIdentityMatrix(int n)
{
var result = new Matrix(n, n);
for (var i = 0; i < n; i++)
{
result[i, i] = 1;
}
return result;
}
По хорошему бы конечно использовать для таких целей именованный конструктор. Но, к сожалению, в C# нет именованных конструкторов.
Сложение матриц на C#
Складывать можно только матрицы одинакового размера. Для удобства реализуем сложение в виде перегруженного оператора
public static Matrix operator +(Matrix matrix, Matrix matrix2)
{
if (matrix.M != matrix2.M || matrix.N != matrix2.N)
{
throw new ArgumentException(
"matrixes dimensions should be equal");
}
var result = new Matrix(matrix.M, matrix.N);
result.ProcessFunctionOverData((i, j) =>
result[i, j] = matrix[i, j] + matrix2[i, j]);
return result;
}
С помощью умножения и сложения сделаем вычитание матриц
public static Matrix operator -(Matrix matrix, Matrix matrix2)
{
return matrix + (matrix2 * -1);
}
Транспонирование матрицы
Транспонированная матрица — это перевернутая по диагонали матрица. Например если B — это транспонированная матрица A, то A[i,j] = B[j,i].
public Matrix CreateTransposeMatrix()
{
var result = new Matrix(this.N, this.M);
result.ProcessFunctionOverData((i, j) => result[i, j] = this[j, i]);
return result;
}
Сравнение чисел с плавающей точкой на C#
Для проекта с матрицами тесты написаны на xUnit. К сожалению у него нет возможности корректно сравнивать числа с плавающей точкой, поэтому я реализовал такой вспомогательный метод
public static void AssertDoubleEqual(double expected, double actual)
{
try
{
Assert.InRange(expected - actual,
-Constants.DoubleComparisonDelta,
Constants.DoubleComparisonDelta);
}
catch (InRangeException)
{
throw new EqualException(expected, actual);
}
}
который сравнивает числа правильно, и если они не равны — бросает понятное исключение. Константа для сравнения у меня объявлена так:
public static class Constants
{
public const double DoubleComparisonDelta = 0.0000001;
}
Рабочий код лежит на гитхабе
