我必须将3d阵列弄平才能进行序列化。
让我们从这个开始:

int[,,] array3D = new int[,,] {
            { { 1, 2 }, { 3, 4 }, {5,6 }, {7,8 } },
            { { 9, 10}, { 11, 12},{ 13,14} , {15,16 }},
            { { 17, 18}, { 19, 20},{ 21,22}, {23,24 } }
        };


这样(类似于1,2,3,4,...,24):

c# - C#将3D矩阵展平/扩展为锯齿状数组-LMLPHP

所以现在我有这个S / R

public static T[] Flatten<T>(T[,,] arr)
{
    int rows0 = arr.GetLength(0);
    int rows1 = arr.GetLength(1);
    int rows2 = arr.GetLength(2);
    T[] arrFlattened = new T[rows0 * rows1* rows2];

    int i, j, k;
    for (k = 0; k < rows2; k++)
    {
        for (j = 0; j < rows1; j++)
        {
            for (i = 0; i < rows0; i++)
            {
                var test = arr[i, j, k];
                int index = i + j * rows0 + k * rows1;
                arrFlattened[index] = test;
            }
        }
    }
    return arrFlattened;
}


将3d矩阵展平为1d数组

c# - C#将3D矩阵展平/扩展为锯齿状数组-LMLPHP

我不够聪明,无法理解该程序是否正确,但让我们进一步。
然后,使用以下代码扩展

public static T[,,] Expand<T>(T[] arr, int rows0, int rows1)
{
    int length = arr.GetLength(0);
    int rows2 = length / rows0 / rows1;

    T[,,] arrExpanded = new T[rows0, rows1, rows2];
    for (int k = 0; k < rows2; k++)
    {
        for (int j = 0; j < rows1; j++)
        {
            for (int i = 0; i < rows0; i++)
            {
                T test = arr[i + j * rows0 + k * rows1];
                arrExpanded[i, j, k] = test;
            }
        }
    }
    return arrExpanded;
}


但是结果如下:

c# - C#将3D矩阵展平/扩展为锯齿状数组-LMLPHP

所以没有像1,2,3,4,5 .... 24
我知道该错误可能是微不足道的,但请尝试尝试,因为我可能找不到它。
预先感谢。

帕特里克



感谢您帮助所有3个解决方案都很棒并且可以工作,但是我选择了一个更容易理解和调试的解决方案

最佳答案

我假设您想知道代码中的错误多于想要知道答案的最快方法。您的索引计算错误。您正在这样计算:

int index = i + j * rows0 + k * rows1;


但实际上,您不仅需要将最后一项乘以row1,还应乘以row0:

int index = i + j * rows0 + k * rows1 * rows0;


此外,交换在for循环中迭代的维度顺序以按顺序获得结果也很有意义。最终的代码将是:

    public static T[] Flatten<T>(T[,,] arr)
    {
        int rows0 = arr.GetLength(0);
        int rows1 = arr.GetLength(1);
        int rows2 = arr.GetLength(2);
        T[] arrFlattened = new T[rows0 * rows1* rows2];

        int i, j, k;
        for (k = 0; k < rows0; k++)
        {
            for (j = 0; j < rows1; j++)
            {
                for (i = 0; i < rows2; i++)
                {
                    var test = arr[k, j, i];
                    int index = i + j * rows2 + k * rows1 * rows2;
                    arrFlattened[index] = test;
                }
            }
        }
        return arrFlattened;
    }

    public static T[,,] Expand<T>(T[] arr, int rows0, int rows1)
    {
        int length = arr.GetLength(0);
        int rows2 = length / rows0 / rows1;

        T[,,] arrExpanded = new T[rows0, rows1, rows2];
        int i, j, k;
        for (k = 0; k < rows0; k++)
        {
            for (j = 0; j < rows1; j++)
            {
                for (i = 0; i < rows2; i++)
                {
                    T test = arr[i + j * rows2 + k * rows1 * rows2];
                    arrExpanded[k, j, i] = test;
                }
            }
        }
        return arrExpanded;
    }

关于c# - C#将3D矩阵展平/扩展为锯齿状数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56474607/

10-11 05:38