Comment faire la somme des éléments de matrice dans MATLAB?

compte tenu de la matrice:

A = [1 2 3; 4 5 6; 7 8 9];
  1. Comment pourriez-vous utiliser une boucle for pour calculer la somme des éléments de la matrice?
  2. Ecrire une commande MATLAB d'une ligne en utilisant la fonction sum pour la somme les éléments de matrice dans A.

Ma réponse:

1)

for j=1:3,
    for i=j:3,
        A(i,:) = A(i,:)+A(j+1,:)+A(j+2,:)
    end
end

2)

sum(A)

ce Sont les réponses exactes? Je ne savais pas comment l'utiliser if,while et for. Quelqu'un peut-il expliquer à la moi?

11
demandé sur gnovice 2009-11-12 15:52:20

6 réponses

pour les très grandes matrices utilisant sum(sum(A)) peut être plus rapide que sum(A(:)):

>> A = rand(20000);
>> tic; B=sum(A(:)); toc; tic; C=sum(sum(A)); toc
Elapsed time is 0.407980 seconds.
Elapsed time is 0.322624 seconds.
26
répondu Mohsen Nosratinia 2013-10-08 14:46:36

1)

total = 0;
for i=1:size(A,1)
  for j=1:size(A,2)
    total = total + A(i,j);
  end
end

2)

total = sum(A(:));
18
répondu merv 2009-11-12 12:59:56

une autre réponse à la première question Est d'utiliser pour la boucle et effectuer linéaire indexation dans le tableau en utilisant la fonction NUMEL pour obtenir le nombre total d'éléments:

total = 0;
for i = 1:numel(A)
  total = total+A(i);
end
10
répondu gnovice 2009-11-12 15:10:49

éviter les boucles dans la mesure du possible.

sum(A(:))

est super mais si vous avez une certaine logique d'indexation de passe vous ne pouvez pas utiliser la (:), mais vous pouvez écrire

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

puisque la somme additionne les colonnes et additionne le vecteur de ligne qui a été créé par la première somme. Notez que cela ne fonctionne que si la matrice est 2-dim.

3
répondu Reed Richards 2011-07-15 14:39:13

la meilleure pratique est certainement d'éviter les boucles ou les récursions dans Matlab.

Entre sum(A(:)) et sum(sum(A)). D'après mon expérience, les tableaux de Matlab semblent être stockés dans un bloc continu en mémoire comme vecteurs de colonnes empilées. Ainsi la forme de A n'a pas tout à fait d'importance dans sum(). (On peut tester reshape() et vérifier si le remodelage est rapide à Matlab. Si c'est le cas, alors nous avons une raison de croire que la forme d'un tableau n'est pas directement liée à la façon dont les données sont stockées et manipuler.)

en tant Que tel, il n'y a pas de raison sum(sum(A)) devrait être plus rapide. Il serait plus lent si Matlab crée en fait un vecteur de ligne enregistrant la somme de chaque colonne d'une première et ensuite la somme sur les colonnes. Mais je pense que sum(sum(A)) est très répandue parmi les utilisateurs. Il est probable qu'ils en dur code sum(sum(A)) une seule boucle, le même sum(A(:)).

ci-dessous, j'offre quelques résultats de tests. Dans chaque test, A=rand (taille) et la taille est spécifiée dans le texte.

la première est d'utiliser tic toc.

Size 100x100
sum(A(:))
Elapsed time is 0.000025 seconds.
sum(sum(A))
Elapsed time is 0.000018 seconds.

Size 10000x1
sum(A(:))
Elapsed time is 0.000014 seconds.
sum(A)
Elapsed time is 0.000013 seconds.

Size 1000x1000
sum(A(:))
Elapsed time is 0.001641 seconds.
sum(A)
Elapsed time is 0.001561 seconds.

Size 1000000
sum(A(:))
Elapsed time is 0.002439 seconds.
sum(A)
Elapsed time is 0.001697 seconds.

Size 10000x10000
sum(A(:))
Elapsed time is 0.148504 seconds.
sum(A)
Elapsed time is 0.155160 seconds.

Size 100000000
Error using rand
Out of memory. Type HELP MEMORY for your options.

Error in test27 (line 70)
A=rand(100000000,1);

ci-dessous utilise cputime

Size 100x100
The cputime for sum(A(:)) in seconds is 
0
The cputime for sum(sum(A)) in seconds is 
0

Size 10000x1
The cputime for sum(A(:)) in seconds is 
0
The cputime for sum(sum(A)) in seconds is 
0

Size 1000x1000
The cputime for sum(A(:)) in seconds is 
0
The cputime for sum(sum(A)) in seconds is 
0

Size 1000000
The cputime for sum(A(:)) in seconds is 
0
The cputime for sum(sum(A)) in seconds is 
0

Size 10000x10000
The cputime for sum(A(:)) in seconds is 
0.312
The cputime for sum(sum(A)) in seconds is 
0.312

Size 100000000
Error using rand
Out of memory. Type HELP MEMORY for your options.

Error in test27_2 (line 70)
A=rand(100000000,1);

Dans mon expérience, les deux compteurs sont valables jusqu'à .1s. Donc, si vous avez une expérience similaire avec les minuteries Matlab, aucun des tests ne peut discerner sum(A(:)) et sum(sum(A)).

j'ai essayé la plus grande taille permise sur mon ordinateur quelques fois de plus.

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

ils semblent équivalents. Soit on est bon. Mais sum(sum(A)) exige que vous connaissiez la dimension de votre tableau est 2.

2
répondu Argyll 2014-04-08 06:27:57

Vous essayez de résumer tous les éléments de Tableau 2d

Dans Matlab utiliser

Array_Sum = sum(sum (Array_Name));

0
répondu Riz 2014-04-01 15:36:36