J'ai une matrice avec des nombres entiers et je dois remplacer toutes les apparences de 2 par -5. Quel est le moyen le plus efficace de le faire? Je l'ai fait comme ci-dessous, mais je suis sûr qu'il y a une manière plus élégante.
a=[1,2,3;1,3,5;2,2,2]
ind_plain = find(a == 2)
[row_indx col_indx] = ind2sub(size(a), ind_plain)
for el_id=1:length(row_indx)
a(row_indx(el_id),col_indx(el_id)) = -5;
end
Au lieu d'une boucle, je cherche quelque chose comme: a (row_indx, col_indx) = -5, ce qui ne fonctionne pas.
find
n'est pas nécessaire dans ce cas. Utilisez plutôt l'indexation logique:
a(a == 2) = -5
En cas de recherche si une matrice est égale à inf
vous devriez utiliser
a(isinf(a)) = -5
Le cas général est:
Mat(boolMask) = val
où Mat
est votre matrice, boolMask
est une autre matrice de valeurs logical
et val
est la valeur d'attribution.
Essaye ça:
a(a==2) = -5;
La version un peu plus longue serait
ind_plain = find(a == 2);
a(ind_plain) = -5;
En d'autres termes, vous pouvez indexer une matrice directement à l'aide d'index linéaires. Inutile de les convertir à l'aide de ind2sub
- très utile! Mais comme démontré ci-dessus, vous pouvez être encore plus court si vous indexez la matrice à l'aide d'une matrice booléenne.
En passant, vous devriez mettre des points-virgules après vos déclarations si (comme d'habitude) vous n'êtes pas intéressé à obtenir le résultat de la déclaration exportée sur la console.
La méthode de Martin B est bonne si vous modifiez des valeurs en vecteur. Cependant, pour l'utiliser dans la matrice, vous devez obtenir des index linéaires.
La solution la plus simple que j'ai trouvée consiste à utiliser la fonction changem
. Très facile à utiliser:
mapout = changem(Z,newcode,oldcode)
Dans votre cas: newA = changem(a, 5, -2)
Plus d'infos: http://www.mathworks.com/help/map/ref/changem.html
Voici une implémentation triviale, non optimisée et probablement lente de changem
à partir de la Mapping Toolbox.
function mapout = changem(Z, newcode, oldcode)
% Idential to the Mapping Toolbox's changem
% Note the weird order: newcode, oldcode. I left it unchanged from Matlab.
if numel(newcode) ~= numel(oldcode)
error('newcode and oldcode must be equal length');
end
mapout = Z;
for ii = 1:numel(oldcode)
mapout(Z == oldcode(ii)) = newcode(ii);
end
end