12
votes

Quels sont les moyens de sumer les éléments matriciels à Matlab?

Compte tenu de la matrice:

sum(A)


2 commentaires

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.


6 Réponses :


18
votes

1) xxx

2) xxx


2 commentaires

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?



11
votes

Une autre réponse pour la première question est d'utiliser un 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: xxx


0 commentaires

3
votes

Évitez les boucles dans la mesure du possible.

% Sum all elements under 45 in the matrix
sum ( sum ( A *. ( A < 45 ) )


0 commentaires

31
votes

pour de très grandes matrices utilisant Somme (somme (a)) peut être plus rapide que somme (A (:)) : xxx < / p>


5 commentaires

Belle trouver! En fait, cela semble même plus rapide pour presque toutes tailles. Même pour rand (100) la différence est significative sur mon système. (Bien que non pour rand (10000,1) ). Cependant, comme il s'agit d'une fraction d'une seconde, je recommanderais toujours le plus robuste / général somme (A (:)) à la plupart des fins.


@Dennis Jaheruddin i Préfère Somme (Somme (A)) Comme il est plus efficace de calcul. Le seul avantage de somme (A (:)) 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) , maintenant comparer somme (somme (m))) 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 (:))) est plus précis que TIC et TOC .



0
votes

Vous essayez de résumer tous les éléments du tableau 2-D

dans l'utilisation MATLAB

array_sum = somme (somme (array_name));


1 commentaires

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).



2
votes

La meilleure pratique est définitivement pour éviter les boucles ou les récursions dans Matlab.

entre 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>

En tant que tel, il n'y a aucune raison 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>.

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>

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


2 commentaires

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)) , mais tout le reste est contre juste somme (a) ...