我可以转置方形矩阵,但现在我想用用户输入转置非方形矩阵(在我的代码3 * 2中)。
其他消息来源建议我先创建一个新矩阵,我已经完成了。我设法制作矩阵,但在转置时,它会从第4个值停止。
我查看了其他主题,但无法找到错误。这是我的代码到目前为止,有人可以告诉我哪里出错了吗?
谢谢!
//const
const int ROWS = 3;
const int COLS = 2;
//first matrix
int[,] matrix1 = new int[ROWS, COLS];
for (int i = 0; i < ROWS; i++)
{
for (int j = 0; j < COLS; j++)
{
Console.Write("Enter num: ");
matrix1[i, j] = int.Parse(Console.ReadLine());
}
}
//output
Console.WriteLine("Eerste matrix: ");
for (int i = 0; i < ROWS; i++)
{
for (int j = 0; j < COLS; j++)
{
Console.Write(matrix1[i, j] + " ");
}
Console.WriteLine(" ");
}
//transposed matrix
Console.WriteLine("Tweede matrix: ");
int[,] matrix2 = new int[COLS, ROWS];
for (int i = 0; i < ROWS; i++)
{
for (int j = 0; j < COLS; j++)
{
matrix2[j, i] = matrix1[j, i];
Console.Write(matrix2[j, i] + " ");
}
Console.WriteLine(" ");
}
这是我在运行程序时得到的结果:
//output
Enter num: 1
Enter num: 2
Enter num: 3
Enter num: 4
Enter num: 5
Enter num: 6
first matrix:
1 2
3 4
5 6
transposed matrix:
1 3
2 4
//--->> Only went up to 4th value?
答案 0 :(得分:3)
因此,在开始时,您加载一个带字段的矩阵:“i,j”=&gt; “行,列”
在最后一步,您尝试使用“j,i”=&gt;访问矩阵“列,行”命令。
你正在反转i,j索引.-
让我通过更改变量名来帮助您:
//常量
const int ROWS = 3;
const int COLS = 2;
//first matrix
int[,] matrix1 = new int[ROWS, COLS];
for (int row = 0; row < ROWS; row++)
{
for (int column = 0; column < COLS; column ++)
{
Console.Write("Enter num: ");
matrix1[row, column] = int.Parse(Console.ReadLine());
}
}
//输出
Console.WriteLine("Eerste matrix: ");
for (int row = 0; row < ROWS; row++)
{
for (int column = 0; column < COLS; column++)
{`enter code here`
Console.Write(matrix1[row, column] + " ");
}
Console.WriteLine(" ");
}
//转置矩阵
Console.WriteLine("Tweede matrix: ");
int[,] matrix2 = new int[COLS, ROWS];
for (int row = 0; row < ROWS; row++)
{
for (int column = 0; column < COLS; column++)
{
matrix2[column, row] = matrix1[row, column];
Console.Write(matrix2[column, row] + " ");
}
Console.WriteLine(" ");
}
//编辑:实际上注意到样本没有正确地对其进行处理。固定它。
答案 1 :(得分:1)
替换
matrix2[j, i] = matrix1[j, i];
带
matrix2[j, i] = matrix1[i, j];
这样,矩阵1的行号成为矩阵2的列号 - 即矩阵被转置。
答案 2 :(得分:0)
如果您将其他两个答案结合起来,您将获得完整的图片:
此行错误,会为您提供IndexOutOfRangeException
:
matrix2[j, i] = matrix1[j, i];
为了转置你需要翻转索引:
matrix2[j, i] = matrix1[i, j];
另一个问题是,当您打印矩阵时,您可以切换行和列 将每个功能的代码提取到单独的方法中会更容易 此外,使用名称i和j可能会造成混淆。它们看起来很像,但它们并没有传达它们的含义。使用矩阵时,我喜欢使用r和c(或行和列)
void PrintMatrix(int[,] m)
{
int rows = m.GetLength(0);
int columns = m.GetLength(1);
for (int r = 0; r < rows; r++) {
for (int c = 0; c < columns; c++) {
Console.Write(m[r, c] + " ");
}
Console.WriteLine();
}
}
int[,] TransposeMatrix(int[,] m)
{
int rows = m.GetLength(0);
int columns = m.GetLength(1);
int[,] transposed = new int[columns, rows];
for (int r = 0; r < rows; r++) {
for (int c = 0; c < columns; c++) {
transposed[c, r] = m[r, c];
}
}
return transposed;
}
然后代码的最后一部分变得简单:
PrintMatrix(matrix1);
Console.WriteLine();
int[,] matrix2 = TransposeMatrix(matrix1);
PrintMatrix(matrix2);