Incrémenter une valeur d'un tableau de MATLAB plusieurs fois dans une ligne
-
08-10-2019 - |
Question
Ceci est une question sur incrémenter une valeur d'un tableau de Matlab plusieurs fois dans la même déclaration, sans avoir à utiliser une boucle.
Je mis mon tableau comme:
>> A = [10 20 30];
Et puis exécutez:
>> A([1, 1]) = A([1, 1]) + [20 3]
A =
13 20 30
Il est clair que le 20 est ignoré. Cependant, je voudrais qu'il soit inclus, de sorte que:
>> A = [10 20 30];
>> A([1, 1]) = A([1, 1]) + [20, 3]
donnerait:
A =
33 20 30
Y at-il une fonction pour permettre que cela se fasse dans un joli vectorisé mode?
(En réalité, l'indexation au tableau comprendrait plusieurs index, il pourrait être [1 1 2 2 1 1 1 1 3 3 3]
etc., avec un tableau de nombres par incrément (le [20, 3]
ci-dessus) de la même longueur.)
La solution
Qu'est-ce que vous voulez faire peut être fait en utilisant la fonction accumArray , comme suit:
A = [10 20 30]; %# Starting array
index = [1 2 2 1]; %# Indices for increments
increment = [20 10 10 3]; %# Value of increments
A = accumarray([1:numel(A) index].',[A increment]); %'# Accumulate starting
%# values and increments
Et la sortie de cet exemple doit être:
A = [33 40 30];
EDIT: Si A
est un large éventail de valeurs, et il y a seulement quelques incréments pour ajouter, ce qui suit peut être plus efficace que le calcul ci-dessus:
B = accumarray(index.',increment); %'# Accumulate the increments
nzIndex = (B ~= 0); %# Find the indices of the non-zero increments
A(nzIndex) = A(nzIndex)+B(nzIndex); %# Add the non-zero increments
Autres conseils
Peut-être qu'il ya quelque chose que je ne comprends pas tout à fait, mais vous essayez essentiellement d'ajouter 23 au premier élément de A, non? Vous pouvez donc écrire:
A([1, 1]) = A([1, 1]) + sum([20 3])
En outre, si vous avez un tableau d'index, vous pouvez écrire
indexArray = [1 2 2 3 1 1 2 1];
toAdd = [20 3];
A = [10 20 30];
A(indexArray) + sum(toAdd)
ans =
33 43 43 53 33 33 43 33