2010-10-02 7 views
7

J'ai un tableau de la longueur m*n, qui stocke une liste de double élément.Convertir tableau en matrice

Comment le convertir en une matrice de m*n?

Ceci est la signature de la méthode.

//returns a matrix of [m,n], given arr is of length m*n 
static double[,] ConvertMatrix(Array arr, int m, int n) 
{ 
} 
+2

Hhm vous devez savoir soit ' n' ou 'm'. Un tableau avec 16 éléments pourrait être représenté par '16 * 1',' 8 * 2', '4 * 4',' 2 * 8' et '1 * 16'. –

+1

Hah! Un tableau EST une matrice! Bonne blague. –

+0

Oui, 'm' et' n' sont connus. Question mise à jour – Graviton

Répondre

12

Vous pouvez utiliser Buffer.BlockCopy pour le faire de façon très efficace:

using System; 

class Test 
{ 
    static double[,] ConvertMatrix(double[] flat, int m, int n) 
    { 
     if (flat.Length != m * n) 
     { 
      throw new ArgumentException("Invalid length"); 
     } 
     double[,] ret = new double[m, n]; 
     // BlockCopy uses byte lengths: a double is 8 bytes 
     Buffer.BlockCopy(flat, 0, ret, 0, flat.Length * sizeof(double)); 
     return ret; 
    } 

    static void Main() 
    { 
     double[] d = { 2, 5, 3, 5, 1, 6 }; 

     double[,] matrix = ConvertMatrix(d, 3, 2); 

     for (int i = 0; i < 3; i++) 
     { 
      for (int j = 0; j < 2; j++) 
      { 
       Console.WriteLine("matrix[{0},{1}] = {2}", i, j, matrix[i, j]); 
      } 
     } 
    } 
} 
+0

L'utilisation de sizeof (double) au lieu de plain 8 prend en charge les implémentations dans lesquelles le type double a une taille différente. Je ne sais pas si une telle bête existe. Encore. –

+4

@ Frédéric: En fait * garanti * d'être 8 par la spécification (voir section 18.5.8) - mais 'sizeof (...)' serait plus explicite de toute façon. –

4
private static T[,] create2DimArray<T>(T[] array, int n) 
     { 
      if (n <= 0) 
       throw new ArgumentException("Array N dimension cannot be less or equals zero","n"); 
      if (array == null) 
       throw new ArgumentNullException("array", "Array cannot be null"); 
      if (array.Length == 0) 
       throw new ArgumentException("Array cannot be empty", "array"); 

      int m = array.Length % n == 0 ? array.Length/n : array.Length/n + 1; 
      var newArr = new T[m,n]; 
      for (int i = 0; i < arr.Length; i++) 
      { 
       int k = i/n; 
       int l = i % n; 
       newArr[k, l] = array[i]; 
      } 

      return newArr; 
     } 
2

Créer la matrice et boucle les éléments en elle:

static double[,] ConvertMatrix(double[] arr, int m, int n) { 
    double[,] result = new double[m, n]; 
    for (int i = 0; i < arr.Length; i++) { 
    result[i % m, i/m] = arr[i]; 
    } 
    return result; 
} 
Questions connexes