Matriz multidimensional [][] vs [,] [duplicado]
double[][] ServicePoint = new double[10][9]; // <-- gives an error (1)
double[,] ServicePoint = new double[10,9]; // <-- ok (2)
¿Cuál es su diferencia? (1) produce un error, ¿cuál es el motivo?
Y
double d = new double[9]
ServicePoint[0] = d;
el uso de (2) generará un error. ¿Por qué?
Uno es una matriz de matrices y el otro es una matriz 2D. El primero puede ser irregular, el segundo es uniforme.
Es decir, a double[][]
puede ser válidamente:
double[][] x = new double[5][];
x[0] = new double[10];
x[1] = new double[5];
x[2] = new double[3];
x[3] = new double[100];
x[4] = new double[1];
Debido a que cada entrada en la matriz es una referencia a una matriz de double
. Con una matriz irregular, puede realizar una asignación a una matriz como desea en el segundo ejemplo:
x[0] = new double[13];
En el segundo elemento, debido a que es una matriz 2D uniforme, no puede asignar una matriz 1D a una fila o columna, porque debe indexar tanto la fila como la columna, lo que lo lleva a una sola double
:
double[,] ServicePoint = new double[10,9];
ServicePoint[0]... // <-- meaningless, a 2d array can't use just one index.
ACTUALIZAR :
Para aclarar según su pregunta, la razón por la que su número 1 tuvo un error de sintaxis es porque tenía esto:
double[][] ServicePoint = new double[10][9];
Y no puede especificar el segundo índice en el momento de la construcción. La clave es que ServicePoint no es una matriz 2D, sino una matriz 1D (de matrices) y, por lo tanto, dado que está creando una matriz 1D (de matrices), especifica solo un índice:
double[][] ServicePoint = new double[10][];
Luego, cuando crea cada elemento en la matriz, cada uno de ellos también son matrices, por lo que puede especificar sus dimensiones (que pueden ser diferentes, de ahí el término matriz irregular ):
ServicePoint[0] = new double[13];
ServicePoint[1] = new double[20];
En primera instancia, estás intentando crear lo que se llama una matriz irregular.
double[][] ServicePoint = new double[10][9].
La declaración anterior habría funcionado si se hubiera definido como se muestra a continuación.
double[][] ServicePoint = new double[10][]
Lo que esto significa es que está creando una matriz de tamaño 10, que puede almacenar 10 matrices de diferentes tamaños en su interior. En términos simples, una matriz de matrices. Vea la imagen a continuación, que significa una matriz irregular.
http://msdn.microsoft.com/en-us/library/2s05feca(v=vs.80).aspx
El segundo es básicamente una matriz bidimensional y la sintaxis es correcta y aceptable.
double[,] ServicePoint = new double[10,9];//<-ok (2)
Y para acceder o modificar una matriz bidimensional tienes que pasar ambas dimensiones, pero en tu caso estás pasando solo una dimensión, por eso el error
El uso correcto sería
ServicePoint[0][2]
Se refiere a un elemento de la primera fila y tercera columna.
Representación pictórica de su matriz bidimensional.