了解多维数组

Understanding multidimensional array

我正在尝试了解多维数组。我找不到合适的文章来理解每个块表示什么。

对于一维,我们知道 int[] = 单行元素

对于二维,int[] = 第一个索引表示总行数,第二个表示总列数

对于 3D,int[] = 我从 quora 上读到,第一个索引是行,第二个是列,第三个可以表示为页面。所以 x 页有 r 行和 c 列。所以如果x为2,r为2,c为2,那么如果我没猜错的话,一共有2个方阵。

for 4D, int[] = 他说,行,列和一行元素的页面(将其可视化为一行立方体) 我无法理解,5D及以后没有答案。

Quora 回答 link:https://qr.ae/pvKcLb


接下来我找到了这篇文章https://www.mathworks.com/matlabcentral/answers/250488-how-a-4d-and-5d-matrix-or-array-look-like-can-we-say-that-a-4d-array-is-another-for-of-3d-or-reshap#answer_197039,内容如下

  1. 向量是标量数组。
  2. 二维矩阵是向量数组。
  3. 3D 数组是 2D 矩阵的数组。
  4. 4 维数组是 3 维数组的数组。
  5. 5 维数组是 4 维数组的数组。
  6. 等等

因此,由于他的回答看起来很容易理解,所以我尝试编码而不是可视化,最后我得到了以下代码片段!

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PracticeCSharp.CSharp
{
    class CSL10
    {
        public void MultiDArrExample()
        {
            int[] _1D = new int[] { 1, 2, 3, 4, 5 };


            int[,] _2D = new int[,]
            {
                { 1, 2, 3, 4, 5 },
                { 1, 2, 3, 4, 5 }
            };

            int[,,] _3D = new int[,,]
            {
                {
                    { 1, 2, 3, 4, 5 },
                    { 1, 2, 3, 4, 5 }
                },
                {
                    { 1, 2, 3, 4, 5 },
                    { 1, 2, 3, 4, 5 }
                }
            };

            int[,,,] _4D = new int[,,,]
            {
                {
                    {
                        { 1, 2, 3, 4, 5 },
                        { 1, 2, 3, 4, 5 }
                    },
                    {
                        { 1, 2, 3, 4, 5 },
                        { 1, 2, 3, 4, 5 }
                    }
                },
                {
                    {
                        { 1, 2, 3, 4, 5 },
                        { 1, 2, 3, 4, 5 }
                    },
                    {
                        { 1, 2, 3, 4, 5 },
                        { 1, 2, 3, 4, 5 }
                    }
                }
            };

            //My head started spinning.. and cant go further.. 
        }
    }
}

你能帮助理解这个多维数组吗?哪些是真实世界的用例,这种多维数组的替代方案是什么?

提前致谢!

我们生活在一个 3D 世界中,所以超过这 3 个维度的任何东西对我们人类来说都变得难以想象和想象。

但这对电脑来说是没有问题的。可以支持几乎无限多的维度(取决于内存、处理能力等)

然而,这确实意味着不可能找到 4/5/21 维数组的“真实世界”示例。因为我们的世界根本就没有!

另请参阅这篇文章,其中解释得更多一些并且有更多链接:

https://www.preposterousuniverse.com/blog/2009/03/30/why-cant-we-visualize-more-than-three-dimensions/

为了理解 multi-dimensional 数组,我试图理解数组的每个部分表示什么。我当时就明白了

我只是想了解表示数组不同部分的方式。多亏了 Caius Jard,我明白了它是如何工作的,并且我能够成功地对 multi-dimensional 数组进行对象初始化。我已经完成了 6D,并且还在继续。我将代码添加到答案中,供任何可能需要它来了解 MultiD-Array 工作原理的人使用

这里是对象初始化代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PracticeCSharp.CSharp
{
    class CSL10
    {
        public void MultiDArrExample()
        {
            //1 dimensional
            //Line
            int[] _1D = new int[] { 5, 5 };

            //2 dimensional
            //Paragraph
            int[,] _2D = new int[,]
            {
                {5, 5 },
                {5, 5 }
            };

            //3 dimensional
            //A page with paragraphs
            int[,,] _3D = new int[1, 2, 2]
            {
                {
                    {5, 5 },
                    {5, 5 }
                }
            };

            //3 dimensional
            //A book with 2 pages and 2,2 paragraphs in each page
            int[,,,] _4D = new int[1, 2, 2, 2]
            {
                //Book 1
                {
                    //Page 1
                    {
                        //Para
                        {5, 5 },
                        {5, 5 }
                    },

                    //Page 2
                    {
                        //Para
                        {5, 5 },
                        {5, 5 }
                    }
                }
            };

            //5 dimensional
            //A library with 2 books with 2 pages and 2,2 paragraphs in each page
            int[,,,,] _5D = new int[1, 2, 2, 2, 2]
            {
                //Library
                {
                    //Book 1
                    {
                        //Page 1
                        {
                            //Para
                            {5, 5 },
                            {5, 5 }
                        },

                        //Page 2
                        {
                            //Para
                            {5, 5 },
                            {5, 5 }
                        }
                    },
                    //Book 2
                    {
                        //Page 1
                        {
                            //Para
                            {5, 5 },
                            {5, 5 }
                        },

                        //Page 2
                        {
                            //Para
                            {5, 5 },
                            {5, 5 }
                        }
                    }
                }
            };

            //6 dimensional
            //A town with 2 libraries with 2 books each with 2 pages in each book and 2,2 paragraphs in each page
            int[,,,,,] _6D = new int[1, 2, 2, 2, 2, 2]
            {
                //town
                {
                    //Library 1
                    {
                        //Book 1
                        {
                            //Page 1
                            {
                                //Para
                                {5, 5 },
                                {5, 5 }
                            },

                            //Page 2
                            {
                                //Para
                                {5, 5 },
                                {5, 5 }
                            }
                        },
                        //Book 2
                        {
                            //Page 1
                            {
                                //Para
                                {5, 5 },
                                {5, 5 }
                            },

                            //Page 2
                            {
                                //Para
                                {5, 5 },
                                {5, 5 }
                            }
                        }
                    },
                    //Library 2
                    {
                        //Book 1
                        {
                            //Page 1
                            {
                                //Para
                                {5, 5 },
                                {5, 5 }
                            },

                            //Page 2
                            {
                                //Para
                                {5, 5 },
                                {5, 5 }
                            }
                        },
                        //Book 2
                        {
                            //Page 1
                            {
                                //Para
                                {5, 5 },
                                {5, 5 }
                            },

                            //Page 2
                            {
                                //Para
                                {5, 5 },
                                {5, 5 }
                            }
                        }
                    }
                }
            };
        }
    }
}

然后迭代一个 6 维数组

//Iterating a 6D array
int totalTowns = 1;
int totalLibrariesInEachTown = 2;
int totalBooksInEachLibrary = 2;
int totalPagesInEachBook = 2;
int totalRowsInEachPage = 2;
int totalColsInEachPage = 2;

int count = 1;
for (int town = 0; town < totalTowns; town++)
{
    for (int library = 0; library < totalLibrariesInEachTown; library++)
    {
        for (int book = 0; book < totalBooksInEachLibrary; book++)
        {
            for (int page = 0; page < totalPagesInEachBook; page++)
            {
                for (int row = 0; row < totalRowsInEachPage; row++)
                {
                    for (int col = 0; col < totalColsInEachPage; col++)
                    {
                        Console.WriteLine($"Count: {count++} Reading array location " +
                            $"[{town},{library},{book},{page},{row},{col}] = " +
                            _6D[town, library, book, page, row, col]);
                    }
                }
            }
        }
    }
}