C# 令人困惑的指数出界
在我的代码中有一部分我需要反转矩阵。这只能合理地在一个正方形矩阵上进行,在这种情况下是一个3x3的正方形矩阵。我用来反转矩阵的工具一直说我的数组不是一个合适的正方形 所以我做了一个小测试:C# 令人困惑的指数出界,c#,matrix,multidimensional-array,C#,Matrix,Multidimensional Array,在我的代码中有一部分我需要反转矩阵。这只能合理地在一个正方形矩阵上进行,在这种情况下是一个3x3的正方形矩阵。我用来反转矩阵的工具一直说我的数组不是一个合适的正方形 所以我做了一个小测试: double[,] x = new double[3, 3]; MessageBox.Show(x.GetLength(0).ToString()); MessageBox.Show(x.GetLength(1).ToString()); MessageBox.Show(x.GetLength(2).ToS
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”。第三个出现为索引自动失效异常
。我只是忽略了一些非常明显的事情还是。。。这有点奇怪吗
(注意:这是C#使用.Net 2.0编写的代码)您只有一个二维数组。为什么要求第三维的大小才能得到有效的结果
Array.GetLength()
方法返回数组指定维度中的元素数。就你而言:
x.GetLength(2).ToString(); // asking for size of third dimension
你在问一个二维数组,它的第三维大小是多少。结果是一个索引自动失效异常
。这是预期的行为
在您的代码示例中,您可能会混淆每个指定维度的大小和维度的数量。以下是一些不同尺寸的矩形阵列示例:
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
看到模式了吗?维度的数量由您在数组声明中指定的数量决定。每个维度的大小由声明中每个数字的值决定。您的矩阵只有2个维度,两个维度的长度均为3个元素。第三个
消息框
行试图打印不存在的三维的长度。数组中没有定义3个维度,因此只能获得2个维度的长度。您的代码要求的是立方体的尺寸,而不是正方形
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.
只是提供一个直观的例子,并用我自己的话提供一个答案。。。(我一开始也没能理解为什么会抛出异常):
double[,]x=新的double[3,3]代码>提供了一个如下所示的数组:
[0,0] [1,0] [2,0]
[0,1] [1,1] [2,1]
[0,2] [1,2] [2,2]
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
我认为代码试图找到子数组的长度,其中每一行代表一个数组,而该数组又是一个较大数组的成员
实际上,行本身不是数组,只是原始数组的成员(双倍)。GetLength
方法查找的是数组的维度,而不是长度(这可能会造成混淆,因为length
用于确定数组中的成员数)。此数组有两个维度,即X
维度和Y
维度(如果愿意)
把它想象成一个平面,有两个维度。如果添加第三个:
double[,,] x = new double[3, 3, 3];
工作表变成了一个立方体,添加了一个新的维度Z
,第三个GetLength
将起作用。这可能有助于您可视化所解释的内容
声明的x数组如下所示:
[0,0] [1,0] [2,0]
[0,1] [1,1] [2,1]
[0,2] [1,2] [2,2]
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
好。。。就像我说的,可能忽略了一些显而易见的事情。没有帮助,我是基于一个VB项目,它做了我做的方式,并以某种方式成功。。。谢谢我时不时会有这些大脑屁。@KChaloux:也许你把检查交错数组的长度与多维数组中的维度长度混淆了?我加上三维数组的样子:double[,]x=new double[3,4,5];平地上的所有居民都知道,仅仅是三维空间的概念是相当荒谬的。