了解多维数组
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
- 向量是标量数组。
- 二维矩阵是向量数组。
- 3D 数组是 2D 矩阵的数组。
- 4 维数组是 3 维数组的数组。
- 5 维数组是 4 维数组的数组。
- 等等
因此,由于他的回答看起来很容易理解,所以我尝试编码而不是可视化,最后我得到了以下代码片段!
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 维数组的“真实世界”示例。因为我们的世界根本就没有!
另请参阅这篇文章,其中解释得更多一些并且有更多链接:
为了理解 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]);
}
}
}
}
}
}
我正在尝试了解多维数组。我找不到合适的文章来理解每个块表示什么。
对于一维,我们知道 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
- 向量是标量数组。
- 二维矩阵是向量数组。
- 3D 数组是 2D 矩阵的数组。
- 4 维数组是 3 维数组的数组。
- 5 维数组是 4 维数组的数组。
- 等等
因此,由于他的回答看起来很容易理解,所以我尝试编码而不是可视化,最后我得到了以下代码片段!
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 维数组的“真实世界”示例。因为我们的世界根本就没有!
另请参阅这篇文章,其中解释得更多一些并且有更多链接:
为了理解 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]);
}
}
}
}
}
}