C# 数组矩阵
C# Matrix of arrays
我正在用 c# 编写一个程序,该程序将 12 个元素的数组与值的三元组相关联。我想将我的数据存储在维度 [n,m,p] 的矩阵中,但每个元素实际上是一个数组。现实世界的应用程序正在为 3D 笛卡尔坐标 space.
中的每个点保存 12 个传感器的输出
我试过这样的事情:
int[][,,] foo = new int[12][,,];
但是,如果我是对的,这会创建一个包含 12 个矩阵的 3x3 数组,而我想要一个包含 12 个元素数组的 NxMxP 矩阵。
如果我尝试像这样指定矩阵维度:
int[][,,] foo = new int[12][N,M,P];
我收到错误 CS0178 (Invalid rank specifier: expected ',' or ']'
) and CS1586 (Array creation must have array size or array initializer
)。
我还在学习 C#,请原谅我提出这个琐碎的问题,但我无法解决这个问题。我正在使用 visual studio 2015.
尝试使用 4 维数组。
int[,,,] foo = new int[N,M,P, 12];
如果您想创建12
实例 [N, M, P]
矩阵组织为数组(请,请注意 int[][,,]
是矩阵数组,而不是数组矩阵):
int[][,,] foo = Enumerable
.Range(0, 12)
.Select(_ => new int[N, M, P])
.ToArray();
或者
int[][,,] foo = Enumerable
.Repeat(new int[N, M, P], 12)
.ToArray();
如果你喜欢循环
// please, notice the different declaration:
int[][,,] foo = new int[12];
for (int i = 0; i < foo.Length; ++i)
foo[i] = new int[N, M, P];
编辑:如果你想要[N, M, P]
数组矩阵(见评论):
I'm trying to get NMP instances of 12-elements arrays, addressable by
the n,m,p indices
// please, notice the different declaration: matrix of arrays
int[,,][] foo = new int[N, M, P][];
for (int i = 0; i < foo.GetLength(0); ++i)
for (int j = 0; j < foo.GetLength(1); ++j)
for (int k = 0; k < foo.GetLength(2); ++k)
foo[i, j, k] = new int[12];
int[][,,] foo
您正在创建一个 3 维数组(整数)数组。如果你想初始化那个数组,那么你必须这样做:
int[][,,] foo = new int[12][,,];
然后遍历 foo
并为每个单元格初始化 3-D 数组:
foo[i] = new int[M,N,P];
您可以使用一些 LINQ 使其成为单行代码(请参阅 Dmitry 的回答),但基本上是一样的。
C# 中的多维数组使用起来有点麻烦。
我不知道它是否对您有帮助(也许您只需要数组),但您可以尝试创建简单的 Point3D class。这将提高可读性,我认为,维护。
public class Point3D
{
int X { get; set; }
int Y { get; set; }
int Z { get; set; }
public Point3D(int x, int y, int z)
{
this.X = x;
this.Y = y;
this.Z = z;
}
}
然后:
Point3D[] arrayOfPoints = new Point3D[12];
arrayOfPoints[0] = new Point3D(0, 2, 4);
我正在用 c# 编写一个程序,该程序将 12 个元素的数组与值的三元组相关联。我想将我的数据存储在维度 [n,m,p] 的矩阵中,但每个元素实际上是一个数组。现实世界的应用程序正在为 3D 笛卡尔坐标 space.
中的每个点保存 12 个传感器的输出我试过这样的事情:
int[][,,] foo = new int[12][,,];
但是,如果我是对的,这会创建一个包含 12 个矩阵的 3x3 数组,而我想要一个包含 12 个元素数组的 NxMxP 矩阵。
如果我尝试像这样指定矩阵维度:
int[][,,] foo = new int[12][N,M,P];
我收到错误 CS0178 (Invalid rank specifier: expected ',' or ']'
) and CS1586 (Array creation must have array size or array initializer
)。
我还在学习 C#,请原谅我提出这个琐碎的问题,但我无法解决这个问题。我正在使用 visual studio 2015.
尝试使用 4 维数组。
int[,,,] foo = new int[N,M,P, 12];
如果您想创建12
实例 [N, M, P]
矩阵组织为数组(请,请注意 int[][,,]
是矩阵数组,而不是数组矩阵):
int[][,,] foo = Enumerable
.Range(0, 12)
.Select(_ => new int[N, M, P])
.ToArray();
或者
int[][,,] foo = Enumerable
.Repeat(new int[N, M, P], 12)
.ToArray();
如果你喜欢循环
// please, notice the different declaration:
int[][,,] foo = new int[12];
for (int i = 0; i < foo.Length; ++i)
foo[i] = new int[N, M, P];
编辑:如果你想要[N, M, P]
数组矩阵(见评论):
I'm trying to get NMP instances of 12-elements arrays, addressable by the n,m,p indices
// please, notice the different declaration: matrix of arrays
int[,,][] foo = new int[N, M, P][];
for (int i = 0; i < foo.GetLength(0); ++i)
for (int j = 0; j < foo.GetLength(1); ++j)
for (int k = 0; k < foo.GetLength(2); ++k)
foo[i, j, k] = new int[12];
int[][,,] foo
您正在创建一个 3 维数组(整数)数组。如果你想初始化那个数组,那么你必须这样做:
int[][,,] foo = new int[12][,,];
然后遍历 foo
并为每个单元格初始化 3-D 数组:
foo[i] = new int[M,N,P];
您可以使用一些 LINQ 使其成为单行代码(请参阅 Dmitry 的回答),但基本上是一样的。
C# 中的多维数组使用起来有点麻烦。
我不知道它是否对您有帮助(也许您只需要数组),但您可以尝试创建简单的 Point3D class。这将提高可读性,我认为,维护。
public class Point3D
{
int X { get; set; }
int Y { get; set; }
int Z { get; set; }
public Point3D(int x, int y, int z)
{
this.X = x;
this.Y = y;
this.Z = z;
}
}
然后:
Point3D[] arrayOfPoints = new Point3D[12];
arrayOfPoints[0] = new Point3D(0, 2, 4);