41 votes

Différence entre les fonctions numel et length de MATLAB

Je sais que length(x) renvoie à max(size(x)) y numel(x) renvoie le nombre total d'éléments de x, mais lequel est le meilleur pour un tableau de 1 par n ? Est-ce important, ou sont-ils interchangeables dans ce cas ?

EDIT : Juste pour le plaisir :

alt text

On dirait que les performances sont les mêmes jusqu'à 100 000 éléments.

20voto

gnovice Points 70970

Pour un tableau 1 par N, ils sont essentiellement les mêmes. Pour un tableau multidimensionnel M ils peuvent donner des résultats différents :

  • numel(M) est équivalent à prod(size(M)) .
  • length(M) est équivalent à max(size(M)) . Si M est vide (c'est-à-dire que toute dimension est égale à 0), alors length(M) est égal à 0.

4 votes

Notez que si x = ones(0,n) ; alors max(size(x)) --> n while length(x) --> 0

19voto

ShinTakezou Points 5603

Dans ce cas, ils retournent la même chose et il n'y a pas de différence. En termes de performances, cela dépend du fonctionnement interne des tableaux dans MATLAB. Par exemple, s'il existe des méta-informations sur le nombre d'éléments du tableau (quelle que soit sa forme), alors numel est aussi rapide que possible, tandis que max(size(x)) semble nécessiter plus de travail pour obtenir la même chose (récupérer les tailles, puis trouver le maximum parmi celles-ci). J'ai l'habitude d'utiliser numel dans ce cas, mais le discours de performance (hypothétique) mis à part, je dirais qu'ils sont interchangeables.

5 votes

Vous avez raison sur la partie performance. Je viens de lancer 100 itérations de numel vs length sur x=1:100000000 et numel était en moyenne 3,0919 fois plus rapide. Cela ne devrait pas avoir beaucoup d'importance pour les petits tableaux.

0 votes

...et maintenant je suis vraiment curieux de connaître les performances de numel/length par rapport à la taille du tableau.

8 votes

LENGTH ne sera jamais le goulot d'étranglement des performances de votre programme ! Seules les améliorations réelles des performances comptent. Dans tous les autres cas, c'est la lisibilité du code qui compte.

12voto

Mikhail Points 3393

Comme d'autres l'ont dit, ils sont identiques pour un tableau unidimensionnel.

IMHO du point de vue de la lisibilité du code length doit être utilisé sur des tableaux unidimensionnels. Il s'agit d'environ "programmation intentionnelle" vous voyez le code et vous comprenez ce que le programmeur avait à l'esprit en concevant son travail. Donc, quand je vois numel Je sais qu'il est utilisé sur une matrice.

length vs. numel a été un sujet de discussion dans notre équipe pendant un certain nombre d'années. L'ex-développeur principal ne se souciait pas de la fiabilité du code, mais uniquement de la réalisation du travail et de l'utilisation du code. numel dans un code autrement peu lisible/formaté. L'autre gars est un mathématicien et a utilisé length uniquement sur les tableaux numériques qui sont pour lui de "vrais" tableaux. Pour les tableaux de cellules et les tableaux de structures, il utilisait numel .

2 votes

Bonne perspective - augmentation de la lisibilité sur une minute/augmentation insignifiante des performances. +1

7 votes

Lorsque je vois l'utilisation de NUMEL, je ne suppose pas qu'il est utilisé sur une matrice par rapport à un vecteur, je suppose simplement qu'il est utilisé sur un objet pour lequel les dimensions sont sans importance et que seul l'élément numéro des éléments importe.

0 votes

C'est important lorsque vous allez refactoriser ce code et que vous ne savez pas du premier coup d'œil s'il s'agit d'un vecteur ou d'une matrice !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X