2016-11-28 19 views
8

mam tej macierzy:Dziwne zachowanie find()

a = [1 2 2 1; 1 1 2 2] 

% 1  2  2  1 
% 1  1  2  2 

Chcę znaleźć wszystko 1 i umieścić je na zero.

[~, a_i] = find(a == 1); 
a(a_i) = 0 

% 0  2  2  1 
% 0  0  2  2 

Dlaczego wciąż jest 1 w pierwszym rzędzie?

+4

Pytanie jest ciekawe, i dostaliśmy bardzo dobrą odpowiedź. Ale proponuję zmienić tytuł na coś takiego jak "Dziwne zachowanie find() _. Moja pierwsza myśl, kiedy zobaczyłem bieżący tytuł (_find() nie działa) był "Oczywiście, że tak". –

Odpowiedz

7

Sposób, w jaki to robisz, jesteś tylko coraz indeks kolumna z 1 „s ponieważ używasz tylko Drugie wyjście find.

[~, col] = find(a == 1) 
% 1 1 2 4 

Kiedy użyć tego jako indeksu do a to będzie traktować je jako wskaźnik liniowego i zmienić tylko 1, 2, i 4. Wartości w a do 0. Indeksowanie liniowe jest wykonywane w column-major order, co daje wynik, który widzisz.

Aby zrobić to, co próbujesz zrobić, trzeba zarówno wyjść find uzyskać indeksy wierszy i kolumn, a następnie użyć sub2ind konwertować je do indeksu liniowego, które można następnie wykorzystać do indeksu w a.

[row, col] = find(a == 1); 
a(sub2ind(size(a), row, col)) = 0; 

To dużo łatwiejsze do korzystania z pojedynczej wersji wyjściowej find które po prostu zwraca indeks liniowego bezpośrednio i używać.

ind = find(a == 1); 
a(ind) = 0; 

Albo jeszcze lepiej, wystarczy użyć logicznej indeksowanie

a(a == 1) = 0; 
+0

Dziękuję bardzo! Rozumiem teraz mój błąd! :) – henry