矩阵转置不起作用

本文关键字:不起作用 转置 | 更新日期: 2023-09-27 18:17:17

我正在尝试转置一个 int[,] 矩阵。但是我没有得到正确的输出。我已经用两个 for 循环完成了换位,但我认为我在那里犯了一个错误。我只是不能指出来。

这是我的代码:

int[,] matrix = new int[2,2];
matrix[0, 0] = 1;
matrix[0, 1] = 2;
matrix[1, 0] = 3;
matrix[1, 1] = 4;
public void transponieren()
{
    int[,] temp = this.matrix;
    for (int i = 0; i < this.matrix.GetLength(0); i++)
    {
        for (int j = 0; j < this.matrix.GetLength(1); j++)
        {
             this.matrix[i, j] = temp[j, i];
        }
    }
    transponiert = true;
}

输入

[ 1 , 2 ]
[ 3 , 4 ]

我得到的输出

[ 1 , 3 ]
[ 3 , 4 ]

我已经有另一个有效的解决方案,但我想知道我在这里做错了什么,因为我只是从其他地方复制了工作解决方案。

矩阵转置不起作用

你的问题是这一行:

int[,] temp = this.matrix;

创建新数组。因为int[,]是一个引用类型,所以你最终会得到temp引用this.matrix,所以对其中一个矩阵的任何更改都会影响另一个矩阵。

您的逻辑要求temp实际上是一个单独的数组,因此它会失败。

所以你只需要一个正确大小的新数组:

var temp = new int[this.matrix.GetLength(0),this.matrix.GetLength(1)];

但是,请注意,制作这样的临时数组来转置方阵效率非常低,因为您可以就地转置(但前提是您不介意破坏原始内容(。


[编辑] 额外示例:如何就地转置方阵。

public void TransposeSquareMatrixInPlace(int[,] matrix)
{
    if (matrix == null) throw new ArgumentNullException("matrix");
    if (matrix.GetLength(0) != matrix.GetLength(1)) throw new ArgumentOutOfRangeException("matrix", "matrix is not square");
    int size = matrix.GetLength(0);
    for (int n = 0; n < (size-1); ++n)
    {
        for (int m = n+1; m < size; ++m)
        {
            int temp = matrix[n, m];
            matrix[n, m] = matrix[m, n];
            matrix[m, n] = temp;
        }
    }
}

int[,] temp = this.matrix;

temp 变量保存对矩阵变量的引用。因此,当 i=0 时,输入矩阵被修改。

int[,] temp = new int[this.matrix.GetLength(0),this.matrix.GetLength(1)];
for (int i = 0; i < this.matrix.GetLength(0); i++)
{
    for (int j = 0; j < this.matrix.GetLength(1); j++)
    {
         temp[i, j] = this.matrix[i, j];
    }
}
this.matrix = temp
transponiert = true;
public void Transposition(){
    MatRes = new int[Mat1.GetLength(1), Mat1.GetLength(0)];
    for (int i = 0; i < Mat1.GetLength(1); i++){
        for (int j = 0; j < Mat1.GetLength(0); j++){
             MatRes[i, j] = Mat1[j, i];
        }
    }
}

适用于每种矩阵,将 Mat1 视为转置矩阵,将 MatRes 视为转置矩阵。