2011-05-08 24 views
5

Jestem ciekawy, jaki jest najlepszy sposób na zrobienie tego: Załóżmy, że mam matrycę zerową 10x10 i chcę zastąpić zera tymi znanymi współrzędnymi, w na początek jestem rzeczą o napisaniu pętli for, aby zastąpić elementy jeden po drugim, odczytując x i y. Czy istnieje inny łatwy sposób na zrobienie tego?Zastępowanie elementów w macierzy zgodnie ze współrzędnymi w Matlab

Przykład:

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

zdałem sobie sprawę, że jest to duplikat [niedawnym pytaniem] (http://stackoverflow.com/questions/5886039/matlab-addressing-of-one-index-without-sub2ind/5889492#5889492), na którą odpowiedziałem. Jednak nie winię cię za to, że nie mogłeś go znaleźć, ponieważ tytuł drugiego pytania nie pomógłby ci w poszukiwaniach. – abcd

+0

@Yoda: Myślę, że mój post jest nieco zagmatwany, nie miałem zamiaru mieć przypisanego kształtu oka, ale po prostu podstawię elementy według losowych x i y. Ale dzięki za pomoc :) – tytamu

+0

Yen: Nie ma problemu. Rozwiązanie @ eat jest bardziej ogólne i gdyby Twój przykład był inny, dokładnie to zasugerowałbym. – abcd

Odpowiedz

5

Dla tego rodzaju manipulacji użyć sub2ind, jak

> 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 

Aktualizacja: Aby to kontrast z niewinnym patrząc 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, tak naprawdę to rozgryzłem, to jest sposób, aby to zrobić, dzięki. – tytamu

3

Możesz robić co chcesz przez indeksowanie konkretnych wierszy i kolumn w macierzy i przypisanie wartości do przekątnej.

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 
Powiązane problemy