создать новый многомерный массив и заполнить его значениями из других массивов - PullRequest
3 голосов
/ 01 июня 2011

у меня есть, скажем, следующие массивы ..

int[] array_1 = new int[1] { 2 };
int[] array_2 = new int[2] { 3, 4 };
int[] array_3 = new int[3] { 7,5, 6 };
int combinations;
combinations = array_1.Length * array_2.Length * array_3.Length;

что я хочу сделать, это создать новый массив, в котором каждый столбец будет содержать элементы из каждого из вышеуказанных массивов, а количество строк будет являться комбинацией всех элементов вышеуказанного массива. в этом случае количество столбцов равно 3 (потому что у меня есть 3 массива), а количество столбцов равно 6, так как комбинации всех элементов 1 * 2 * 3 = 6. Итак, мой новый массив будет:

int array_num = 3;
int[,] comb = new int[combinations, array_num];

Я хочу заполнить каждый столбец следующим образом: Первый столбец будет содержать элементы из массива array_1, которые будут меняться каждые

int c0 = (combinations / array_1.Length);

элементы. второй столбец будет содержать элементы из array_2, которые будут меняться каждые

int c1=(c0/array_2.Length);

элементы. А третий столбец будет содержать элементы из thw array_3, которые будут меняться каждые

int c2=(c1/array_3.Length);

элементы. Для этого конкретного примера массив результатов будет выглядеть так:

2     3     7    
2     3     5
2     3     6
2     4     7
2     4     5
2     4     6

Надеюсь, я прояснил свою проблему и с нетерпением жду каких-либо предложений о том, как мне начать, так как я новичок в программировании.

Ответы [ 4 ]

1 голос
/ 01 июня 2011
    static int[,] Combine(params int[][] arrays)
    {
        int[][] combined = CombineRecursive(arrays).Select(x=>x.ToArray()).ToArray();
        return JaggedToRectangular(combined);
    }

    static IEnumerable<IEnumerable<int>> CombineRecursive(IEnumerable<IEnumerable<int>> arrays)
    {
        if (arrays.Count() > 1)
            return from a in arrays.First()
                   from b in CombineRecursive(arrays.Skip(1))
                   select Enumerable.Repeat(a, 1).Union(b);
        else
            return from a in arrays.First()
                   select Enumerable.Repeat(a, 1);
    }

    static int[,] JaggedToRectangular(int[][] combined)
    {
        int length = combined.Length;
        int width = combined.Min(x=>x.Length);
        int[,] result = new int[length, width];

        for (int y = 0; y < length; y++)
            for (int x = 0; x < width; x++)
                result[y, x] = combined[y][x];

        return result;
    }
1 голос
/ 01 июня 2011
    static int[,] Combine(params int[][] arrays)
    {
        int[] pointers = new int[arrays.Length];

        int total = arrays.Aggregate(1, (m, array) => m * array.Length);
        int[,] result = new int[total, arrays.Length];

        for (int i = 0; i < arrays.Length; i++)
            result[0, i] = arrays[i][0];

        for (int y = 1; y < total; y++)
            for (int x = arrays.Length - 1; x >= 0; x--)
            {
                ++pointers[x];
                for (int i = x; i >= 0; i-- )
                    if (pointers[i] >= arrays[i].Length)
                    {
                        pointers[i] = 0;
                        if (i>0)
                            pointers[i - 1]++;
                    }
                result[y, x] = arrays[x][pointers[x]];
            }

        return result;
    }
1 голос
/ 01 июня 2011

Вы в основном пытаетесь преобразовать 3D-позиции в 2D-массив, вам нужно рассчитать 2D-позицию из 3D-позиции и скопировать значения.

Используется для циклов, например,

for (int dim0 = 0; dim0 < array1.Length; dim0++)
{
    for (int dim1 = 0; dim1 < array2.Length; dim1++)
    {
        for (int dim2 = 0; dim2 < array3.Length; dim2++)
        {
            var pos = (dim0 * array2.Length + dim2) * array3.Length + dim2;
            var pos0 = pos / array2.Length / array2.Length;
            var pos1 = pos % (array2.Length * array2.Length);
            matrix[pos0, pos1] = ...
        }
    }
}
0 голосов
/ 01 июня 2011
for i = 0 to arraysize1
{
    for j = 0 to arraysize2
    {
        for k = 0 to arraysize3
        {

            array1[i] , array1[j] , array1[k] is what you are looking for

        }

    }
}

Как видите, цикл будет запускать arraysize1 * arraysize2 * arraysize3 и генерировать все комбинации для случая, который вы только что перечислили.

Если количество массивов не известно заранее. Вам нужно будет узнать о рекурсии .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...