我试图转置一个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]
我已经有另一个有效的解决方案,但我想知道我在这里做错了什么,因为我只是从其他地方复制了工作解决方案。
答案 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。