【问题标题】:C# Matrix of arraysC# 数组矩阵
【发布时间】:2017-08-03 15:04:36
【问题描述】:

我正在用 C# 编写一个程序,它将一个包含 12 个元素的数组与一个三元组值相关联。我想将我的数据存储在维度为 [n,m,p] 的矩阵中,但每个元素实际上都是一个数组。实际应用是为 3D 笛卡尔空间中的每个点保存 12 个传感器的输出。

我尝试过这样的事情:

int[][,,] foo = new int[12][,,];

但是,如果我是对的,这会创建一个由 12 个 3x3 矩阵组成的数组,而我想要一个由 12 个元素数组组成的 NxMxP 矩阵。

如果我尝试像这样指定矩阵尺寸:

int[][,,] foo = new int[12][N,M,P];

我收到错误 CS0178 (Invalid rank specifier: expected ',' or ']') 和 CS1586 (Array creation must have array size or array initializer)。

我还在学习 c#,请原谅我提出这个琐碎的问题,但我无法解决这个问题。我正在使用 Visual Studio 2015。

【问题讨论】:

    标签: c# arrays matrix jagged-arrays


    【解决方案1】:

    如果你想创建12 instances of [N, M, P] 矩阵组织为 array(请注意 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] 数组矩阵(参见 cmets):

    我正在尝试获取 12 元素数组的 NMP 实例,可通过以下方式寻址 n,m,p 指数

      // 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];
    

    【讨论】:

    • 感谢您的回答,但这不是我想要实现的。您可以说我正在尝试获取 12 元素数组的 NMP 个实例,可通过 n,m,p 索引进行寻址。我希望这能澄清我在寻找什么。
    • @Marcomattia Mocellin:那么您必须更改声明,请参阅编辑。
    【解决方案2】:

    尝试使用 4 维数组。

    int[,,,] foo = new int[N,M,P, 12];
    

    【讨论】:

    • 这是一种可能的解决方案,但考虑到 C# 中的多维数组有多丑陋,我不会特别想在其中添加另一个维度。特别是如果用户需要能够将 3x3 矩阵传递给某个函数或其他函数。如果是这种情况,从 4x4 矩阵中雕刻出 3x3 矩阵可能会很痛苦。
    • 这不会像一个 15 元素数组的列表吗?有了这个非常简单的解决方案,就可以调用例如第一个三元组的第四个元素是这样的:int bar = foo[0,0,0,3]?
    【解决方案3】:
    int[][,,] foo
    

    您正在创建一个 3-D 数组(int)的数组。如果要初始化该数组,则必须这样做:

    int[][,,] foo = new int[12][,,];
    

    然后循环遍历foo 并为每个单元格初始化 3-D 数组:

    foo[i] = new int[M,N,P];
    

    您可以使用一些 LINQ 使其成为单线(参见 Dmitry 的回答),但它基本上等同于同一件事。

    使用 C# 中的多维数组有点痛苦。

    【讨论】:

      【解决方案4】:

      我不知道它是否会对您有所帮助(也许您只需要数组),但您可以尝试创建简单的 Point3D 类。这将提高可读性,我认为,维护。

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

      【讨论】:

      • 比你,但我不需要获取/设置 x,y,z 坐标,我需要将 12 元素数组关联到空间中的 ax,y,z 点,我想使用 x,y,z 值作为索引(有可能,因为它们表示为刻度,即 X=255 表示 X 是 255*tick mm),因为理论上它应该是合理的......
      猜你喜欢
      • 2012-02-18
      • 1970-01-01
      • 2016-06-09
      • 1970-01-01
      • 1970-01-01
      • 2015-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多