【问题标题】:How to get 1D arrays from matrix如何从矩阵中获取一维数组
【发布时间】:2011-02-15 22:29:54
【问题描述】:

我有一个矩阵。我需要从我的矩阵中获取一维数组。例如,我有以下矩阵:
123
456
789
所以它看起来像 3 个数组:147、258、369。 但我在这段代码中得到“索引超出范围异常”:

  int[] b = new int[n];
        for (i = 0; i < n; i++)
        {
            b[i] = a[i, n];
            Console.Write(b[i] + " ");
        }
        Console.WriteLine();

感谢任何帮助。

这里是已经可以使用的完整代码:

static void Main(string[] args)
    {        
        int n = 0, m = 0, i = 0, j = 0;           

        Random r = new Random();

        Console.WriteLine("Please, input matrix size:");
        Console.Write("\tn = ");

        n = Convert.ToInt32(Console.ReadLine());
        Console.Write("\tm = ");

        m = Convert.ToInt32(Console.ReadLine());
        Console.WriteLine();

        int[,] a = new int[n, m];           

        for (i = 0; i < n; i++)
        {
            for (j = 0; j < m; j++)
            {                  
                a[i, j] = r.Next(0, 2);                   
            }                
        }

        showMe(a, n, m);

        Console.WriteLine();
        run(a, n, m);

        Console.ReadKey();

        int[][] b = new int[m][];
        for (i = 0; i < m; i++) 
        { 
            b[i] = new int[n]; 
            for (j = 0; j < n; j++) 
            {
                b[i][j] = a[j, i];
                Console.Write(b[i][j] + " ");
            }
            Console.WriteLine();
        }
        Console.WriteLine();
        Console.ReadKey();
    }

【问题讨论】:

  • 你能确认a的第一个维度的大小是n吗?在此示例中查看 an 的定义会很有帮助。
  • 你是指147、258和369吗?
  • 哦,真的……谢谢。我会改正的。

标签: c# arrays matrix


【解决方案1】:

我假设 n=3 并且它是一个方阵,a[i, n]; 将超出 a 的范围 - 您可以参考的最大索引是 n-1。

我想你想要的是

    int[][] b = new int[m][];
    for (i = 0; i < m; i++)
    {
        b[i] = new int[n];
        for (j = 0; j < n; j++)
        {
            b[i][j] = a[j,i];
        }

    }

b[0] 是你的第一个数组,b[1] 是你的第二个......

【讨论】:

  • 在尝试读取数组的第 [_,n] 个元素之前,您需要验证 n 是否小于 m
  • 好的,坦克斯。我做错了什么?我想写矩阵,按回车,得到我的数组。
【解决方案2】:

试试这个:

        int n = 3;
        int[,] a = new int[,] { 
            { 1, 2, 3 }, 
            { 4, 5, 6 }, 
            { 7, 8, 9 } };

        int[] b = new int[n];
        for (int i = 0; i < n; i++)
        {
            b[i] = a[i, n - 1];
            Console.Write(b[i] + " ");
        }
        Console.ReadLine();

这将输出 3 6 9 因为 n 没有被改变。 Jimmy 是对的,a[i,n] 必须是 a[i, n-1]。

【讨论】:

    【解决方案3】:

    这通常适用于二维数组。

    public static T[][] ToJaggedArray<T>(this T[,] arr)
    {
        return Enumerable.Range(0, arr.GetUpperBound(0) + 1)
                         .Select(i => Enumerable.Range(0, arr.GetUpperBound(1) + 1)
                                                .Select(j => arr[i, j])
                                                .ToArray())
                         .ToArray();
    }
    
    public static T[][] ToJaggedArrayTranspose<T>(this T[,] arr)
    {
        return Enumerable.Range(0, arr.GetUpperBound(1) + 1)
                         .Select(j => Enumerable.Range(0, arr.GetUpperBound(0) + 1)
                                                .Select(i => arr[i, j])
                                                .ToArray())
                         .ToArray();
    }
    
    // you'd be interested in ToJaggedArrayTranspose()
    var mat = new[,]
    {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9},
    };
    var arr = mat.ToJaggedArrayTranspose();
    // arr === new[][] { new[] {1, 4, 7}, new[] {2, 5, 8}, new[] {3, 6, 9} }
    

    p.s.,总是在多维数组上使用GetUpperBound()来获取维度的长度,不要试图猜测。

    【讨论】:

      猜你喜欢
      • 2016-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-09
      • 1970-01-01
      • 1970-01-01
      • 2020-03-19
      • 2013-06-23
      相关资源
      最近更新 更多