2011-05-08 2 views
5

Je suis curieux de savoir quelle est la meilleure façon de le faire: supposer que j'ai une matrice de zéro 10x10 et je veux remplacer les zéros par ceux avec les coordonnées connues, en Au début, je suis d'écrire une boucle pour remplacer les éléments un par un en lisant les x et y. Y a-t-il un autre moyen plus facile de le faire?Remplacer les éléments dans une matrice en fonction des coordonnées dans matlab

Exemple:

mat=zeros(10); 
x=[1,3,5,7,9]'; 
y=[2,4,6,8,10]'; 
newmat= [0 0 0 0 0 0 0 0 0 0 
     1 0 0 0 0 0 0 0 0 0 
     0 0 0 0 0 0 0 0 0 0 
     0 0 1 0 0 0 0 0 0 0 
     0 0 0 0 0 0 0 0 0 0 
     0 0 0 0 1 0 0 0 0 0 
     0 0 0 0 0 0 0 0 0 0 
     0 0 0 0 0 0 1 0 0 0 
     0 0 0 0 0 0 0 0 0 0 
     0 0 0 0 0 0 0 0 1 0] 
+0

Je viens de réaliser que c'est un double de [une question récente] (http://stackoverflow.com/questions/5886039/matlab-addressing-of-one-index-without-sub2ind/5889492#5889492), auquel j'ai répondu. Cependant, je ne vous blâme pas de ne pas pouvoir le trouver car le titre de l'autre question ne vous aurait pas aidé à chercher. – abcd

+0

@Yoda: Je pense que mon article est quelque peu déroutant, je n'avais pas l'intention d'assigner une forme à l'œil, mais simplement de substituer les éléments selon x et y. Mais merci pour l'aide :) – tytamu

+0

Yen: Pas de problème. La solution de @ eat est plus générale, et si votre exemple avait été différent, c'est exactement ce que j'aurais suggéré. – abcd

Répondre

5

Pour ce genre de manipulations utilisent sub2ind, comme

> mat=zeros(10); x=[1,3,5,7,9]'; y=[2,4,6,8,10]'; 
> mat(sub2ind([10 10], y, x))= 1 
mat = 
    0 0 0 0 0 0 0 0 0 0 
    1 0 0 0 0 0 0 0 0 0 
    0 0 0 0 0 0 0 0 0 0 
    0 0 1 0 0 0 0 0 0 0 
    0 0 0 0 0 0 0 0 0 0 
    0 0 0 0 1 0 0 0 0 0 
    0 0 0 0 0 0 0 0 0 0 
    0 0 0 0 0 0 1 0 0 0 
    0 0 0 0 0 0 0 0 0 0 
    0 0 0 0 0 0 0 0 1 0 

Mise à jour: Pour contraste avec air innocent assigmnet mat(y, x)= 1.

> mat= zeros(10); 
> mat(y, x)= 1 
mat = 
    0 0 0 0 0 0 0 0 0 0 
    1 0 1 0 1 0 1 0 1 0 
    0 0 0 0 0 0 0 0 0 0 
    1 0 1 0 1 0 1 0 1 0 
    0 0 0 0 0 0 0 0 0 0 
    1 0 1 0 1 0 1 0 1 0 
    0 0 0 0 0 0 0 0 0 0 
    1 0 1 0 1 0 1 0 1 0 
    0 0 0 0 0 0 0 0 0 0 
    1 0 1 0 1 0 1 0 1 0 
+0

Yap, en fait, je viens de comprendre c'est la façon de le faire, merci. – tytamu

3

Vous pouvez faire ce que vous voulez en indexant les lignes spécifiques et des colonnes dans la matrice et l'attribution de valeurs à la diagonale.

mat(y,x)=eye(length(x)) 
mat = 

    0  0  0  0  0  0  0  0  0  0 
    1  0  0  0  0  0  0  0  0  0 
    0  0  0  0  0  0  0  0  0  0 
    0  0  1  0  0  0  0  0  0  0 
    0  0  0  0  0  0  0  0  0  0 
    0  0  0  0  1  0  0  0  0  0 
    0  0  0  0  0  0  0  0  0  0 
    0  0  0  0  0  0  1  0  0  0 
    0  0  0  0  0  0  0  0  0  0 
    0  0  0  0  0  0  0  0  1  0 
Questions connexes