2011-05-08 8 views
5

Tengo curiosidad acerca de cuál es la mejor manera de hacer esto: supongo que tengo una matriz cero de 10x10 y quiero reemplazar los ceros por unos con las coordenadas conocidas, en Al principio me refiero a escribir un ciclo for para reemplazar los elementos uno por uno leyendo las xey. ¿Hay alguna otra forma más fácil de hacerlo?Reemplazar elementos en una matriz de acuerdo con las coordenadas en matlab

Ejemplo:

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

simplemente me di cuenta de que este es un duplicado de [una pregunta reciente] (http://stackoverflow.com/questions/5886039/matlab-addressing-of-one-index-without-sub2ind/5889492#5889492), que respondí. Sin embargo, no te culpo por no haber podido encontrarlo, ya que el título de la otra pregunta no te habría ayudado en la búsqueda. – abcd

+0

@Yoda: Creo que mi publicación es un tanto confusa, no tenía la intención de asignarle la forma de los ojos, solo sustituí los elementos de acuerdo con las aleatorias xey. Pero gracias por la ayuda :) – tytamu

+0

Yen: No hay problema. La solución de @ eat es más general, y si tu ejemplo hubiera sido diferente, eso es exactamente lo que hubiera sugerido. – abcd

Respuesta

5

Para este tipo de manipulaciones usar sub2ind, como

> 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 

Actualización: Para contrastar esto con aspecto inocente 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, de hecho acabo de descubrir que esta es la manera de hacerlo, gracias. – tytamu

3

Usted puede hacer lo que quiere mediante la indexación de las filas y columnas específicas en la matriz y la asignación de valores a la diagonal.

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 
Cuestiones relacionadas