转置非方矩阵C#

时间:2018-01-17 13:24:01

标签: c# matrix multidimensional-array

我可以转置方形矩阵,但现在我想用用户输入转置非方形矩阵(在我的代码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? 

3 个答案:

答案 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);