Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 令人困惑的指数出界_C#_Matrix_Multidimensional Array - Fatal编程技术网

C# 令人困惑的指数出界

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

在我的代码中有一部分我需要反转矩阵。这只能合理地在一个正方形矩阵上进行,在这种情况下是一个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”。第三个出现为
索引自动失效异常
。我只是忽略了一些非常明显的事情还是。。。这有点奇怪吗


(注意:这是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];平地上的所有居民都知道,仅仅是三维空间的概念是相当荒谬的。