Compte tenu de la matrice:
sum(A)
6 Réponses :
1) 2) p>
Et si vous utilisez 1) au lieu de 2) lorsque vous utilisez Matlab pour quelque chose de réel, vous devez mourir une mort horrible lente;)
Bien qu'une réponse correcte, j'espère voir la réponse la plus intentionnelle pour décourager les boucles. Ils mènent en effet à des morts horribles ralentissement ... peut-être le modifier?
Une autre réponse pour la première question est d'utiliser un em> pour la boucle et de réaliser indexation linéaire dans la matrice à l'aide de la fonction Numel pour obtenir le nombre total d'éléments:
Évitez les boucles dans la mesure du possible.
% Sum all elements under 45 in the matrix sum ( sum ( A *. ( A < 45 ) )
pour de très grandes matrices utilisant Somme (somme (a)) code> peut être plus rapide que
somme (A (:)) code>:
Belle trouver! En fait, cela semble même plus rapide pour presque toutes tailles. Même pour rand (100) code> la différence est significative sur mon système. (Bien que non pour
rand (10000,1) code>). Cependant, comme il s'agit d'une fraction d'une seconde, je recommanderais toujours le plus robuste / général
somme (A (:)) code> à la plupart des fins.
@Dennis Jaheruddin i Préfère Somme (Somme (A)) Code> Comme il est plus efficace de calcul. Le seul avantage de
somme (A (:)) code> est qu'il est plus facile de lire mais il recode toute la matrice A dans un vecteur, donc l'effort de calcul.
@MariOtOuttTTTTTORT, bien sûr, il est moins efficace (comme indiqué dans la réponse), mais en fait, la principale raison pour laquelle je l'utilise est que cela fonctionne également pour des matrices de dimensionnalité plus élevée. Supposons que vous ayez m = rand (3,3,3) code>, maintenant comparer
somme (somme (m))) code> avec
somme (m (m (:)) / code>.
MISE À JOUR: Utilisation de MATLAB 2015B, la différence est à peu près une commande de magnitude plus petite (0,193 sec. V. 0,185 sec.).
TIMINIT (@ () SUM (somme (a))) / TIMEIT (@ () SUM (A (:))) CODE> est plus précis que
TIC code> et
TOC code>.
Vous essayez de résumer tous les éléments du tableau 2-D P>
dans l'utilisation MATLAB P>
array_sum = somme (somme (array_name)); p>
Bien que cela ne soit pas incorrect, de meilleures réponses avec les mêmes informations ont été postées il y a des mois (Mohsen en particulier).
La meilleure pratique est définitivement pour éviter les boucles ou les récursions dans Matlab.
entre En tant que tel, il n'y a aucune raison Ci-dessous, j'offre quelques résultats de test. Dans chaque test, A = Rand (taille) et la taille sont spécifiés dans les textes affichés. P> utilise d'abord TIC TOC. P> somme (A (:)) code> et
somme (somme (A)) code>.
Dans mon expérience, les tableaux de Matlab semblent être stockés dans un bloc continu en mémoire comme des vecteurs colonnés empilés. Donc, la forme d'A n'a pas d'importance dans
somme () code>. (On peut tester
remodeler () code> et vérifier si le remodelage est rapide dans matlab. Si c'est le cas, nous avons une raison de croire que la forme d'un tableau n'est pas directement liée à la manière dont les données sont Stocké et manipulé.) P>
somme (somme (a)) code> devrait être plus rapide. Il serait plus lent que Matlab crée réellement un vecteur de ligne enregistrant la somme de chaque colonne d'une première, puis de la somme sur les colonnes. Mais je pense que
somme (somme (a)) code> est très répandu parmi les utilisateurs. Il est probable qu'ils sont probables
somme (somme (a)) code> comme une seule boucle, identique à
somme (a (:)) p>. P>.
Size 10000x10000
sum(A(:))
Elapsed time is 0.151256 seconds.
sum(A)
Elapsed time is 0.143937 seconds.
Size 10000x10000
sum(A(:))
Elapsed time is 0.149802 seconds.
sum(A)
Elapsed time is 0.145227 seconds.
Size 10000x10000
The cputime for sum(A(:)) in seconds is
0.2808
The cputime for sum(sum(A)) in seconds is
0.312
Size 10000x10000
The cputime for sum(A(:)) in seconds is
0.312
The cputime for sum(sum(A)) in seconds is
0.312
Size 10000x10000
The cputime for sum(A(:)) in seconds is
0.312
The cputime for sum(sum(A)) in seconds is
0.312
Quelqu'un peut-il réduire la taille des cases de code pour moi s'il vous plaît? (Si c'est faisable.)
Le premier est une comparaison contre somme (somme (a)) code>, mais tout le reste est contre juste
somme (a) code> ...
Ce sont des questions vraiment simples. Quelques minutes sur Google avec l'un des innombrables tutoriels auraient sauvé le reste de nous beaucoup de temps.
Essayez d'éviter d'utiliser des boucles pour calculer des trucs dans matlab. Sauf si vous voulez vraiment rendre les choses vraiment lentes ou il n'y a pas d'autre moyen.