web-dev-qa-db-fra.com

Remplacer les valeurs de la matrice par d'autres valeurs

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.

12
user1597969

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

Mat est votre matrice, boolMask est une autre matrice de valeurs logical et val est la valeur d'attribution.

24
Andrey Rubshtein

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.

13
Martin B

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

1
Palli Kominak

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
0
Timmmm