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

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top