矩阵的换位不起作用

时间:2013-06-07 09:40:32

标签: c# arrays transpose

我试图转置一个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]

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

4 个答案:

答案 0 :(得分:3)

你的问题是这一行:

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;
        }
    }
}

答案 1 :(得分:1)

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;

答案 2 :(得分:1)

int [,] temp = this.matrix;

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

答案 3 :(得分:1)

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。