Je veux calculer la somme des éléments dans une matrice qui sont divisibles par 2. Comment faire? Et comment puis-je afficher la réponse sous une forme coordonnée?Comment calculer la somme d'un sous-ensemble d'éléments dans une matrice?
Répondre
Un pseudo-code. Pratiquement une boucle à travers chaque colonne pour chacune des rangées.
sum = 0
for(i = 0; i < matrix.num_rows; i++) {
for(j = 0; j < matrix.num_cols; j++) {
if(matrix[i][j] % 2 == 0)
sum += matrix[i][j]
}
}
Vous ne savez pas exactement ce que vous entendez par forme de coordonnées.
C'est la matrice M
avec seulement ses valeurs même:
(mod(M,2) == 0).*M
Vous pouvez résumer avec sum(M)
ou sum(sum(M))
(pas sûr de ce « forme coordonnée » signifie).
MATLAB n'a pas d'opérateur '%'. Vous voulez [MOD] (http://www.mathworks.com/help/techdoc/ref/mod.html). '%' est pour faire des commentaires. – gnovice
@gnovice - merci, c'est ce que vous obtenez pour taper trop vite :) – adamk
Pas de problème. C'est facile à oublier après avoir travaillé avec beaucoup d'autres langues qui ont '%' comme opérateur. – gnovice
Si vous avez une matrice M
, vous pouvez trouver un logical index (à savoir masque) pour lequel les éléments sont même en utilisant la fonction MOD, qui peut fonctionner sur une matrice entière sans boucles besoin. Pour les entrées dans la matrice qui sont même le reste sera de 0 après la division par 2:
index = (mod(M,2) == 0);
Vous pouvez obtenir les indices de ligne et colonne de ces même entrées en utilisant la fonction FIND:
[rowIndices,colIndices] = find(index);
Et vous pouvez obtenir la somme des éléments même par l'indexation M
avec le masque logique d'en haut pour extraire les entrées et même en utilisant la fonction SUM les additionner:
evenSum = sum(M(index));
Voici un exemple avec une matrice M
créée à l'aide de la fonction MAGIC:
>> M = magic(3)
M =
8 1 6
3 5 7
4 9 2
>> index = (mod(M,2) == 0)
index =
1 0 1 %# A matrix the same size as M with
0 0 0 %# 1 (i.e. "true") where entries of M are even
1 0 1 %# and 0 (i.e. "false") elsewhere
>> evenSum = sum(M(index))
evenSum =
20
OP marqué Matlab comme langue. Les boucles doivent être évitées, car la vectorisation est généralement beaucoup plus rapide. La solution de Gnovice peut même être réduite à une ligne: 'sum (M (mod (M, 2) == 0))' – Doresoom
Oh wow, merci. Je suppose que je ne savais pas que l'OP l'avait initialement marqué comme MATLAB. Mon erreur. –