(V) Zagnieżdżone pętle „for”

Czasami potrzebne są różnice między każdą z kolumn macierzy. W tym przykładzie zagnieżdżone pętle for są używane do znajdowania różnic. Najpierw generowana jest macierz x z dwoma wierszami i czterema kolumnami, do której są przypisywane nazwy kolumn. Następnie wyświetlana jest macierz. Następnie generowana jest macierz xp zer z dwoma wierszami i sześcioma kolumnami w celu przechowywania wyników różnic, a macierzy przypisywane są puste nazwy kolumn. Następnie licznik k dla kolumn macierzy xp jest ustawiany na zero. Wraz ze wzrostem liczby pętli for, k będzie wzrastać o jeden na każdym kroku. Następnie uruchamiane są dwie pętle for. W pętlach elementy xp są wypełnione różnicami między różnymi kolumnami w x. Dwie pętle przechodzą w pętli przez kolumny macierzy x w taki sposób, że żadne kombinacje kolumn nie są powtarzane, a dwie kolumny nigdy nie są takie same. Na każdym kroku kolumny xp mają przypisane nazwy na podstawie nazw w x. Na koniec wyświetlana jest wynikowa macierz xp. Oto przykład:

> x = matrix(1:8,2,4)

> colnames(x) = paste(“c”, 1:4, sep=””)

> x

c1 c2 c3 c4

[1,] 1 3 5 7

[2,] 2 4 6 8

> xp = matrix(0,2,6)

> colnames(xp) = rep(“”,6)

> xp

[1,] 0 0 0 0 0 0

[2,] 0 0 0 0 0 0

> k=0

> for (i in 1:3) {

+ for (j in (i+1):4) {

+ k = k+1

+ xp[,k] = x[,i]-x[,j]

+ colnames(xp)[k] = paste(colnames(x)[i], “-“, colnames(x)[j], sep=””)

+ }

+ }

> xp

c1-c2 c1-c3 c1-c4 c2-c3 c2-c4 c3-c4

[1,] -2 -4 -6 -2 -4 -2

[2,] -2 -4 -6 -2 -4 -2

Zauważ, że liczba kolumn w xp jest równa p (p-1) / 2, gdzie p jest liczbą kolumn w x.

Korzystanie z indeksów

Aby rozwiązać ten problem za pomocą indeksów, tworzone są dwa wektory indeksów. Najpierw generowana jest początkowa macierz x, przypisywane nazwy kolumn i wyświetlane. Następnie tworzone są dwa zbiory indeksów o tej samej długości, indeks 1 i indeks 2. Odpowiednie indeksy w obu zestawach nigdy nie są takie same, a wszystkie możliwe kombinacje są obecne i występują tylko raz. Następnie otrzymana macierz xp jest tworzona przez odjęcie kolumn x w drugim zestawie indeksów od kolumn x w pierwszym zestawie indeksów. Następnie nazwy kolumn dla xp są tworzone i przypisywane za pomocą metody paste () i dwóch zestawów indeksów. Na koniec wyświetlana jest macierz xp. Oto przykład:

> x = matrix(1:8,2,4)

> colnames(x) = paste(“c”, 1:4, sep=””)

> x

c1 c2 c3 c4

[1,] 1 3 5 7

[2,] 2 4 6 8

> ind.1 = rep(1:3,3:1)

> ind.1

[1] 1 1 1 2 2 3

> ind.2 = 2:4

> for(i in 3:4) ind.2 = c(ind.2,i:4)

> ind.2

[1] 2 3 4 3 4 4

> xp = x[,ind.1] – x[,ind.2]

> colnames(xp) = paste(“c”, ind.1, “-“,”c”, ind.2, sep=””)

> xp

c1-c2 c1-c3 c1-c4 c2-c3 c2-c4 c3-c4

[1,] -2 -4 -6 -2 -4 -2

[2,] -2 -4 -6 -2 -4 -2

Zauważ, że pętla for służy do tworzenia drugiego zestawu indeksów. Ponadto indeksy kolumn są powtarzane w obu zestawach indeksów. W przypadku dużych macierzy druga metoda jest szybsza niż pierwsza. Na moim komputerze różnice kolumn dla dwóch macierzy, z których każda zawierała 43 830 wierszy i 35 kolumn, zostały znalezione za pomocą dwóch metod. Obie metody dały tę samą macierz 43 830 na 595. Metoda zapętlania zajęła około 1,5 sekundy, a metoda indeksowania około 1,0 sekundy

Dodaj komentarz

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