2010-05-25 33 views
14

¿Cuál es la diferencia entre 'a[,,] y 'a[][][]? Ambos representan arreglos de 3-d. Me hace escribir array3d.[x].[y].[z] en lugar de array3d.[x, y, z].F # Tipos de matriz multidimensional

¿Por qué no puedo hacer lo siguiente?

> let array2d : int[,] = Array2D.zeroCreate 10 10;; 
> let array1d = array2d.[0];; 

error FS0001: This expression was expected to have type 
    'a []  
but here has type 
    int [,] 

Respuesta

32

La diferencia es que 'a[][] representa una matriz de matrices (de posiblemente diferentes longitudes), mientras que en 'a[,], representa una matriz 2D rectangular. El primer tipo también se llama arrays dentados y el segundo tipo se llama matrices multidimensionales. La diferencia es la misma que en C#, por lo que es posible que desee consultar la documentación de C# para jagged arrays y multidimensional arrays. También hay una excelente documentación en el F# WikiBook.

Para demostrar esto utilizando una imagen, un valor de tipo 'a[][] puede tener este aspecto:

0 1 2 3 4 
5 6 
7 8 9 0 1 

Mientras que un valor de tipo a[,] siempre será un rectángulo y puede verse, por ejemplo, así:

0 1 2 3 
4 5 6 7 
8 9 0 1 

Para obtener una única "línea" de una matriz multidimensional, puede utilizar la notación rebanada:

let array1d = array2d.[0..0,0..9];; 

Rebanadas de hecho regresar matriz multidimensional (en este caso, con una dimensión igual a 1), por lo que puede escribir una función de conversión que devuelve 'a[] así:

let toArray (arr:_[,]) = 
    Array.init arr.Length (fun i -> arr.[0, i]) 

let array1d = array2d.[0..0,0..9] |> toArray;; 
Cuestiones relacionadas