gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 20:49:44 26 4
gpt4 key购买 nike

我必须展平 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):

enter image description here

所以现在我有了这个 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 数组

enter image description here

我不够聪明,无法理解程序是否正确,但让我们更进一步。然后我用下面的 s/r 展开

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

但结果如下:

enter image description here

所以没有什么比 1,2,3,4,5....24我知道这个错误可能是一个微不足道的错误,但我可能会尝试我找不到它。提前致谢。

帕特里克


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

最佳答案

我假设您更想知道代码中的错误是什么,而不是想知道找到答案的最快方法。你的指数计算有误。你是这样计算的:

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

但实际上您不仅需要将最后一项乘以 rows1,还需要乘以 rows0:

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# 将 3D 矩阵展平/扩展为锯齿状数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56474607/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com