(V) Zagnieżdżone pętle „for” z instrukcją „if / else”

W tym przykładzie wykonujemy podstawianie element po elemencie do macierzy na podstawie testu if / else. Najpierw generowana jest macierz x dwa na pięć i wyświetlana jest macierz. Następnie dwie pętle for przechodzą przez indeksy wierszy i kolumn x. W każdym cyklu zestaw instrukcji if / else sprawdza, czy element macierzy jest większy niż pięć. Jeśli wartość elementu jest większa niż pięć, wartość elementu jest zastępowana jedynką. Jeśli nie, kontrola przechodzi do instrukcji else. W instrukcji else wartość elementu jest zastępowana przez zero. Na koniec wyświetlana jest wynikowa macierz. Oto przykład:

> x = matrix(1:10,2,5)

> x

[,1] [,2] [,3] [,4] [,5]

[1,] 1 3 5 7 9

[2,] 2 4 6 8 10

> for (i in 1:2) {

+ for (j in 1:5) {

+ if ( x[i,j]>5 ) x[i,j]=1

+ else x[i,j]=0

+ }

+ }

> x

[,1] [,2] [,3] [,4] [,5]

[1,] 0 0 0 1 1

[2,] 0 0 1 1 1

Korzystanie z indeksów

Wykonanie tej samej zamiany bez pętli jest łatwiejsze. Najpierw generowana i wyświetlana jest macierz x. Następnie druga macierz, y, jest równa x. Macierz y służy do przechowywania wartości x, ponieważ wartości x zmieniane są w dwóch krokach. Następnie elementy w x są ustawiane jako równe nowym wartościom na podstawie oryginalnych wartości, które są w y. Ostatni wynik wyświetlony jest matryca. Oto przykład:

> x = matrix(1:10,2,5)

> x

[,1] [,2] [,3] [,4] [,5]

[1,] 1 3 5 7 9

[2,] 2 4 6 8 10

> y=x

> x[y>5] = 1

> x[y<=5] = 0

> x

[,1] [,2] [,3] [,4] [,5]

[1,] 0 0 0 1 1

[2,] 0 0 1 1 1

Na moim komputerze, przy użyciu macierzy z 43 830 wierszami i 35 kolumnami, metoda zapętlania zajęła około pięciu sekund, a metoda indeksowania mniej niż sekundę

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *