Разделите 3D-матрицу на несколько меньших 3D-матриц

Я пытаюсь создать метод расширения, который позволит мне разделить огромный массив на гораздо меньшие. Мой текущий код выглядит следующим образом, но для генерации по-прежнему требуется около 2 секунд с массивом размером 512x512x512 и размером вспомогательных кубов, установленным на 32x32x32.

public static T[][][][] Divide<T>(this T[][][] array, int xSize, int ySize, int zSize)
{
    int numberOfCubesInAxisX = array.Length / xSize;
    int numberOfCubesInAxisY = array[0].Length / ySize;
    int numberOfCubesInAxisZ = array[0][0].Length / zSize;
    T[][][][] arrayDivided = new T[numberOfCubesInAxisX * numberOfCubesInAxisY * numberOfCubesInAxisZ][][][];
    int index = 0;
    while (index < arrayDivided.Length)
    {
        int xIndex = index / numberOfCubesInAxisZ / numberOfCubesInAxisX;
        int yIndex = index / numberOfCubesInAxisZ % numberOfCubesInAxisY;
        int zIndex = index % numberOfCubesInAxisZ;
        arrayDivided[index] = new T[xSize][][];
        for (int x = 0; x < xSize; x++)
        {
            arrayDivided[index][x] = new T[ySize][];
            for (int y = 0; y < ySize; y++)
            {
                arrayDivided[index][x][y] = new T[zSize];
                for (int z = 0; z < zSize; z++)
                {
                    arrayDivided[index][x][y][z] = array[x + (xIndex * xSize)][y + (yIndex * ySize)][z + (zIndex * zSize)];
                }
            }
        }
        index++;
    }

    return arrayDivided;
}

Если кто-нибудь знает, как его оптимизировать, я буду рад это услышать! Спасибо!

1 ответ
1

Просто быстрый снимок производительности …..

Код рассчитывает

xIndex * xSize xSize*ySize*zSize раз
yIndex * ySize xSize*ySize*zSize раз
zIndex * zSize xSize*ySize*zSize раз

в то время как его следует рассчитывать только один раз для каждой итерации while петля.

Кроме того, x только изменения в первом for петля и y только изменения во втором for петля.

  • Привет, спасибо за подсказку, я действительно немного изменил код. В результате получился не астрономический выигрыш во времени, а небольшой хороший апгрейд. Спасибо за чаевые.

    — Камигаку

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *