【问题标题】:Baffling Index-Out-Of-Bounds莫名其妙的索引越界
【发布时间】:2011-04-01 17:36:28
【问题描述】:

我的代码中有一个部分需要反转矩阵。这只能在方阵上合理地完成,在这种情况下是 3x3 方阵。我用来反转矩阵的工具一直说我的数组不是正确的正方形。

所以我做了一个小测试:

double[,] x = new double[3, 3];

MessageBox.Show(x.GetLength(0).ToString());
MessageBox.Show(x.GetLength(1).ToString());
MessageBox.Show(x.GetLength(2).ToString());

第一个出现为“3”。第二个出现为“3”。第三个是IndexOutOfRangeException。我只是忽略了一些非常明显的东西还是……这有点奇怪?

(注意:这是使用 .Net 2.0 的 C# 代码)

【问题讨论】:

  • Flatland 的所有居民都知道,仅仅是三维的概念是非常荒谬的。

标签: c# matrix multidimensional-array


【解决方案1】:

你只有一个二维数组。你为什么期望要求第三维的大小给你一个有效的结果?

Array.GetLength() 方法返回 Array 指定维度的元素个数。在你的情况下:

x.GetLength(2).ToString();   // asking for size of third dimension

你在问一个二维数组它的第三维的大小是多少。结果是IndexOutOfRangeException。这是预期的行为。

在您的代码示例中,您可能会将每个规定维度的大小与维度数混淆。以下是一些不同维度的矩形数组示例:

var d1 = new int[5];     // one dimensional array, containing 5 elements
var d2 = new int[3,3];   // two-dimensional 3x3 element array
var d3 = new int[2,2,2]; // three-dimension array of 2x2x2 elements
var d4 = new int[2,5,6,8]; // four dimensional array, of 2x5x6x8 elements

看到模式了吗?维数由您在数组声明中指定的多少个数字决定。每个维度的大小由声明中的每个数字的值决定。

【讨论】:

  • 嗯...就像我说的,可能忽略了一些明显的东西。没有帮助我将它基于一个 VB 项目,该项目以我的方式完成,并且以某种方式成功......谢谢。我时不时会放屁。
  • @KChaloux:也许您将检查锯齿状数组的长度与多维数组中的维度长度混淆了?
  • Id 添加 3 维数组的样子:double[,,] x = new double[3,4,5];
【解决方案2】:

您的矩阵只有 2 个维度,都具有 3 个元素的长度。第三行MessageBox 试图打印不存在的第三维的长度。

【讨论】:

    【解决方案3】:

    只是为了提供一个直观的示例并用我自己的话提供答案......(我起初也没有看到为什么抛出异常):

    double[,] x = new double[3, 3]; 给出一个如下所示的数组:

    [0,0] [1,0] [2,0]
    [0,1] [1,1] [2,1]
    [0,2] [1,2] [2,2]
    

    我认为代码试图找到可能被认为是子数组的长度,其中每一行代表一个数组,而该数组又是一个更大数组的成员。

    实际上,行本身并不是数组,只是原始数组的成员(双精度)。 GetLength 方法正在寻找数组的维度而不是长度(这可能会令人困惑,因为Length 用于确定数组中的成员数)。这个数组有两个维度,X 维度和Y 维度,如果你愿意的话。

    可以将其想象为具有两个维度的平板。如果添加第三个:

    double[,,] x = new double[3, 3, 3];
    

    工作表变成一个立方体,添加了一个新维度Z,第三个GetLength 将起作用。

    【讨论】:

      【解决方案4】:
      double[,,] x = new double[3, 3, 3];
      
      MessageBox.Show(x.GetLength(0).ToString());
      MessageBox.Show(x.GetLength(1).ToString());
      MessageBox.Show(x.GetLength(2).ToString());
      

      【讨论】:

        【解决方案5】:

        您的数组中没有定义 3 个维度,因此您只能获得两个的长度。您的代码要求的是立方体的尺寸,而不是正方形。

        double[,] x = new double[3,3] // This sets up a two-dimensional array
        
        MessageBox.Show(x.GetLength(0).ToString()); //Shows the length of the X axis
        MessageBox.Show(x.GetLength(1).ToString()); //Shows the length of the Y axis
        MessageBox.Show(x.GetLength(2).ToString()); //Trys to show the length of Z Axis.
        

        【讨论】:

          【解决方案6】:

          这可以帮助您直观地了解所解释的内容。

          您声明的 x 数组如下所示:

          double[,] x = new double[3, 3];
          
          Dimensions     0,1    0,1    0,1            
          Element       [0,0], [0,1], [0,2]   
          Element       [1,0], [1,1], [1,2]
          Element       [2,0], [2,1], [2,2]
          Lengths        3,3    3,3    3,3
          

          【讨论】:

            猜你喜欢
            • 2012-05-19
            • 1970-01-01
            • 2022-01-23
            • 2013-02-14
            • 2012-03-12
            • 2019-02-04
            相关资源
            最近更新 更多