矩阵转置不起作用
本文关键字:不起作用 转置 | 更新日期: 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 视为转置矩阵。