如何转置矩阵?

12

我使用C#制作了一个8x8的矩阵,现在需要将该矩阵进行转置。你能帮我把这个矩阵转置吗? 这是我的矩阵。

public double[,] MatriksT(int blok)
{
    double[,] matrixT = new double[blok, blok];

    for (int j = 0; j < blok ; j++)
    {
        matrixT[0, j] = Math.Sqrt(1 / (double)blok);

    }

    for (int i = 1; i < blok; i++)
    {
        for (int j = 0; j < blok; j++)
        {
            matrixT[i, j] = Math.Sqrt(2 / (double)blok) * Math.Cos(((2 * j + 1) * i * Math.PI) / 2 * blok);
        }
    }

    return matrixT;

}
3个回答

20
public double[,] Transpose(double[,] matrix)
{
    int w = matrix.GetLength(0);
    int h = matrix.GetLength(1);

    double[,] result = new double[h, w];

    for (int i = 0; i < w; i++)
    {
        for (int j = 0; j < h; j++)
        {
            result[j, i] = matrix[i, j];
        }
    }

    return result;
}

7
public class Matrix<T>
{
    public static T[,] TransposeMatrix(T[,] matrix)
    {
        var rows    = matrix.GetLength(0);
        var columns = matrix.GetLength(1);

        var result = new T[columns, rows];

        for (var c = 0; c < columns; c++)
        {
            for (var r = 0; r < rows; r++)
            {
                result[c, r] = matrix[r, c];
            }
        }

        return result;
    }
}

这就是如何称呼它:

int[,] matris = new int[5, 8]
        {
            {1  , 2 , 3 , 4 , 5 , 6 , 7 , 8 },
            {9  , 10, 11, 12, 13, 14, 15, 16},
            {17 , 18, 19, 20, 21, 22, 23, 24},
            {25 , 26, 27, 28, 29, 30, 31, 32},
            {33 , 34, 35, 36, 37, 38, 39, 40},

        };
var tMatrix = Matrix<int>.TransposeMatrix(matris);

0

你的矩阵不是一个“完全平方”矩阵。你需要一个结果(transposedMatris)矩阵。如果你的矩阵是一个完全平方矩阵,那么在同一个矩阵上交换(a[i, j], a[j, i])就足够了。

泛型类型类有静态方法,应该按以下方式调用该方法。

int[,] transposedMatris = Matrix.TransposeMatrix<int>(matris);
dumpMatrix(transposedMatris);

在控制台上输出转置矩阵。
// Using Generics (dump string, integer, decimal, string)
public static void dumpMatrix<T>(T[,] a)
{
    int m = a.GetLength(0);
    int n = a.GetLength(1);
    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < n; j++)
        {
            Console.Write(a[i, j] + " ");
        }
        Console.WriteLine();
    }
    Console.WriteLine();
}

转置矩阵转储:
1 9 17 25 33 
2 10 18 26 34 
3 11 19 27 35 
4 12 20 28 36 
5 13 21 29 37 
6 14 22 30 38 
7 15 23 31 39 
8 16 24 32 40 

我不确定,但您需要按照以下步骤将图像顺时针旋转90度。

  • 步骤1:转置矩阵

  • 步骤2:水平翻转

     int[,] a = new int[5, 5] {
         {1, 2, 3, 4, 5},
         {6, 7, 8, 9, 10},
         {11, 12, 13, 14, 15},
         {16, 17, 18, 19, 20},
         {21, 22, 23, 24, 25}
     };
     int m = a.GetLength(0);
     int n = a.GetLength(1);
     //dumpMatrix(a);
    
     // 步骤1:转置矩阵
     int temp = 0;
     for (int i = 0; i < m; i++)
     {
         for (int j = i; j < n; j++)
         {
             temp = a[i, j];
             a[i, j] = a[j, i];
             a[j, i] = temp;
         }
     }
     //Console.WriteLine("Step 1: Transpose Matrix");
     //dumpMatrix(a);
    
     // 步骤2:水平翻转
     for (int i = 0; i < m; i++)
     {
         for (int j = 0; j < (n/2); j++)
         {
             temp = a[i, j];
             a[i, j] = a[i, n - 1 - j];
             a[i, n - 1 - j] = temp;
         }
     }
     //Console.WriteLine("Step 2: Flip horizontally");
     //dumpMatrix(a);
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接