Создание антидиагональной матрицы тождеств
У меня есть изображение, которое хранится в DenseMatrix, используя MathNet Numerics.
Для поворота изображения на 90 градусов против часовой стрелки я хочу получить транспонирование, а затем перевернуть результат по вертикали, умножив его на антидиагональную единичную матрицу.
Есть ли быстрый способ инициализации этой матрицы идентичности?
Для матрицы 2x2, которая будет выглядеть так:
0 1
1 0
Обновить:
Я закончил тем, что сделал в значительной степени то, что предложил Джозеф. Оказывается достаточно быстро.
public static Matrix<double> CreateAntiIdentityMatrix(int n)
{
var output = Matrix<double>.Build.Dense(n, n, 0);
for (int i = 0; i <= n - 1; i++)
{
output[i, n - i - 1] = 1;
}
return output;
}
1 ответ
Примерно так должно работать:
var M = MathNet.Numerics.LinearAlgebra.Double.Matrix.Build.Dense(N, N, 0); for (i = 0; i <= N - 1; i++) { M(i, N - i - 1) = 1; }
@ Путь Джозефа быстр. Но я хотел бы представить способ, который выразительно показываетMathNet
функциональность:
var size = 3;
var diagonal = DenseMatrix.CreateDiagonal(size, size, 1);
Console.WriteLine(diagonal);
var reversedColumns = diagonal.EnumerateColumns().Select(c => c.Reverse());
var anti = DenseMatrix.OfColumns(reversedColumns);
Console.WriteLine(anti);
Чтобы получить антидиагональную матрицу, можно взять диагональную и отразить ее по ширине (обратные столбцы).
Результат:
DenseMatrix 3x3-Double
1 0 0
0 1 0
0 0 1
DenseMatrix 3x3-Double
0 0 1
0 1 0
1 0 0