web-dev-qa-db-fra.com

Comment peut-on additionner les éléments de la matrice dans MATLAB?

Étant donné la matrice:

A = [1 2 3; 4 5 6; 7 8 9];
  1. Comment pouvez-vous utiliser une boucle for pour calculer la somme des éléments de la matrice?
  2. Ecrivez une commande MATLAB d'une ligne en utilisant la fonction sum pour additionner les éléments matriciels 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)

Est-ce que ce sont les bonnes réponses? Je ne savais pas comment utiliser if, while et for. Quelqu'un peut-il m'expliquer?

11
izzat

Pour les très grandes matrices, utiliser 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.
27

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
merv

Une autre réponse à la première question consiste à utiliser one pour boucle et effectuer indexation linéaire 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
gnovice

Évitez les boucles pour autant que possible.

sum(A(:))

est génial, mais si vous avez une indexation logique, vous ne pouvez pas utiliser le (:) 

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

Puisque sum additionne les colonnes et le vecteur de lignes créé par la première somme. Notez que cela ne fonctionne que si la matrice est 2-dim.

3
Reed Richards

La meilleure pratique consiste à é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 sous la forme de vecteurs à colonnes empilées. Donc, la forme de A n'a pas vraiment d'importance dans sum(). (On peut tester reshape() et vérifier si le remodelage est rapide dans Matlab. Si c'est le cas, nous avons des raisons 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 manipulées.)

En tant que tel, il n'y a aucune raison pour que sum(sum(A)) soit plus rapide. Il serait plus lent si Matlab crée réellement un vecteur ligne enregistrant la somme de chaque colonne de A en premier, puis la somme sur les colonnes. Mais je pense que sum(sum(A)) est très répandu parmi les utilisateurs. Il est probable qu'ils codent en dur sum(sum(A)) comme une boucle unique, identique à sum(A(:)).

Ci-dessous, je présente quelques résultats de test. A chaque test, A = Rand (taille) et la taille sont spécifiés dans les textes affichés.

Le premier utilise 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);

D'après mon expérience, les deux minuteries n'ont de sens que jusqu'à .1. 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 autorisée sur mon ordinateur plusieurs fois.

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 . L'un ou l'autre est bon. Mais sum(sum(A)) nécessite que vous sachiez que la dimension de votre tableau est 2. 

2
Argyll

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

Dans l'utilisation de Matlab 

Array_Sum = sum (sum (Array_Name));

0
Riz