Создание антидиагональной матрицы тождеств

У меня есть изображение, которое хранится в 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
Другие вопросы по тегам