Как получить 1D массивы из матрицы - PullRequest
1 голос
/ 16 февраля 2011

У меня есть матрица.И мне нужно получить 1D массивы из моей матрицы.Например, у меня есть следующая матрица:
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();
    }

Ответы [ 3 ]

2 голосов
/ 16 февраля 2011

Я предполагаю, что 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] - ваш второй ....

1 голос
/ 16 февраля 2011

Это работает для двумерных массивов в целом.

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} }

ps, Всегда используйте GetUpperBound() на многомерных массивах для получения длины размеровне пытайтесь угадать.

1 голос
/ 16 февраля 2011

Попробуйте это:

        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 не изменяется. Джимми прав, a [i, n] должен быть [i, n-1].

...