【问题标题】:NxNxN Matrix CreationNxNxN 矩阵创建
【发布时间】:2014-04-30 12:27:41
【问题描述】:

我为我的项目编写了一个小型 3D 矩阵创建类。是这样的。

class _3DMatrix
    {
        public static int[, ,] m = new int[3, 3, 3];

        public _3DMatrix(int a)
        {
            for (int x = 0; x < 3; x++)
            {
                for (int y = 0; y < 3; y++)
                {
                    for (int z = 0; z < 3; z++)
                    {
                        m[x, y, z] = a;
                    }
                }
            }
        }

现在看来我必须创建一个 NxNxN 矩阵,它将 N 个值作为构造函数参数。最简单的方法是什么?任何提示/代码 sn-ps 都会有很大帮助。 谢谢。

【问题讨论】:

    标签: c# matrix 3d


    【解决方案1】:

    将常量 3 替换为变量:

    请注意,我将数组更改为非静态数组,因为在这里使用静态数组没有意义。

    class _3DMatrix
    {
        public int[, ,] m;
    
        public _3DMatrix(int size, int a)
        {
            m = new int[size, size, size];
    
            for (int x = 0; x < size; x++)
            {
                for (int y = 0; y < size; y++)
                {
                    for (int z = 0; z < size; z++)
                    {
                        m[x, y, z] = a;
                    }
                }
            }
        }
    

    【讨论】:

    • 太棒了。我将如何为此实现适当的打印功能?使用循环的大小?因为 size 是一个局部变量。 public void Print() { for (int x = 0; x &lt; size; x++) { for (int y = 0; y &lt; 3; y++) { for (int z = 0; z &lt; 3; z++) { Console.Write("{0} ", m[x, y, z]); } Console.WriteLine(); } Console.WriteLine(); } Console.ReadKey(); } 有什么想法吗?
    • 在 .NET 中,数组知道自己的维度。您可以调用 RankGetLength 从您的数组中获取大小。
    • for (int x = 0; x &lt; m.Rank; x++) { for (int y = 0; y &lt; m.Rank; y++) { for (int z = 0; z &lt; m.Rank; z++) 用这个可以吗?请指导。
    • 你能问一个新问题吗?评论不太适合这个。
    【解决方案2】:

    您可以在构造函数中定义矩阵 m 的大小。只要你不改变维度,这就可以了:

    编辑:请注意,我为您的矩阵使用了三种不同的大小(n1、n2、n3),但如果您从不想要不同大小的矩阵,没有理由不能简单地使用 1 个大小参数 (n)。

    class _3DMatrix
    {
        public static int[, ,] m;
    
        public _3DMatrix(int a, int n1, int n2, int n3)
        {
            m = new int[n1,n2,n3];
            for (int x = 0; x < n1; x++)
            {
                for (int y = 0; y < n2; y++)
                {
                    for (int z = 0; z < n3; z++)
                    {
                        m[x, y, z] = a;
                    }
                }
            }
        }
    

    【讨论】:

      【解决方案3】:

      您的代码(以及所有答案)创建了一个 NxN 矩阵,其中所有元素都具有相同的值 a。如果这是你的目标,那你很好。如果不是,您必须在创建函数中传递矩阵元素:

      class _3DMatrix
      {
          public int[, ,] m;
      
          public _3DMatrix(int size, int[,,] a)
          {
              m = new int[size, size, size];
      
              for (int x = 0; x < size; x++)
              {
                  for (int y = 0; y < size; y++)
                  {
                      for (int z = 0; z < size; z++)
                      {
                          m[x, y, z] = a[x,y,z];
                      }
                  }
              }
          }
      

      【讨论】:

        【解决方案4】:

        更短的方法:

        class _3DMatrix
        {
            public int[, ,] m;
        
            public _3DMatrix(int N, int a)
            {
                m = new int[N, N, N];
                Buffer.BlockCopy(Enumerable.Repeat(a, m.Length).ToArray(), 0, m, 0, m.Length * Marshal.SizeOf(a));
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-06-12
          • 1970-01-01
          • 2014-05-31
          • 2020-07-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多