web-dev-qa-db-fra.com

Quelle est la différence entre la cellule et la matrice dans Matlab?

Quelle est la différence entre les cellules (c'est-à-dire avec { }) et la matrice (c'est-à-dire avec [ ]) dans Matlab?

28
suresh.g

Il existe plusieurs différences entre un tableau de cellules et une matrice dans MATLAB:

  • Un tableau de cellules peut contenir tout type d'élément arbitraire dans chaque cellule; tandis qu'une matrice nécessite que les types de ses éléments soient homogènes, c'est-à-dire du même type.

  • En ce qui concerne la disposition de la mémoire, tous les éléments d'une matrice sont disposés de manière contiguë en mémoire, tandis qu'un tableau de cellules contient des pointeurs vers chaque élément du tableau. Cela peut être important lorsque vous envisagez des éléments tels que la localisation du cache pour le code haute performance.

  • Le revers du point 2 est que lorsque vous redimensionnez une matrice, chaque élément de la matrice doit être copié dans la zone de mémoire nouvellement allouée, mais dans le cas d'un tableau de cellules, seule une liste de pointeurs doit être copiée. Selon la taille et le type d'éléments que vous stockez, cela peut signifier que les tableaux de cellules sont beaucoup plus rapides à redimensionner.


Pour illustrer les différences de disposition de la mémoire, considérons un exemple simple:

A = [10 20 30 40];

Ici MATLAB crée une nouvelle variable de matrice nommée A, alloue suffisamment de mémoire pour contenir 4 doubles (32 octets, en supposant des doubles de 8 octets) et attribue cette mémoire à un pointeur qui pointe vers la partie réelle de A. ( Si vous créez une matrice de nombres complexes, de la mémoire est allouée pour la partie imaginaire également, et un pointeur séparé pointe vers cette zone de mémoire).

Créons maintenant un tableau de cellules contenant ces éléments:

B = cell(1, 4);
B{1,1} = 10;
B{1,2} = 20;
B{1,3} = 30;
B{1,4} = 40;

Lorsque MATLAB exécute la première instruction, il crée un tableau de cellules qui contient 4 pointeurs, chacun pouvant pointer vers un type arbitraire. Ainsi, B utilise déjà 16 octets (en supposant des pointeurs 32 bits). La ligne suivante crée une matrice 1x1 contenant la valeur 10 et l'affecte au premier élément du tableau de cellules. Le processus ici est similaire à celui que j'ai décrit ci-dessus pour la création d'une matrice 1x4, sauf que la mémoire allouée est seulement assez grande pour contenir un double (8 octets). Ceci est répété pour chacune des 3 déclarations restantes. Donc, au strict minimum, le deuxième exemple utilise 16 + 8 x 4 = 48 octets.

Notez que chaque variable dans MATLAB comprend également une surcharge de mémoire pour une structure appelée mxArray qui stocke des informations telles que la dimension, le type de données et bien plus sur cette variable. J'ai ignoré cette surcharge pour des raisons de simplicité.

32
Praetorian