# ===================================================================== # ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ ΜΕ R # Εργαστήριο 1: Αριθμητικά Διανύσματα - Λύσεις # ===================================================================== # --------------------------------------------------------------------- # ΑΣΚΗΣΗ 1: Απλές Πράξεις # --------------------------------------------------------------------- # 1(a) Ορισμός αντικειμένων x <- 5 y <- 10 # 1(b) Πράξεις x * y # 50 x + y # 15 x + y/3 # 8.333333 (πρώτα η διαίρεση, μετά η πρόσθεση) (x + y)/3 # 5 x - y/(x - 1) # 2.5 x - y/x - 1 # 2 # 1(c) Υπόλοιπο της διαίρεσης 5066 : 217 5066 %% 217 # 75 # 1(d) Πηλίκο (ακέραιο μέρος της διαίρεσης) 5066 %/% 217 # 23 # 1(e) Επιβεβαίωση: Δ = δ*π + υ 217 * (5066 %/% 217) + 5066 %% 217 # 5066 217 * (5066 %/% 217) + 5066 %% 217 == 5066 # TRUE # TIP: Στην R το 5066:217 δεν είναι διαίρεση. Είναι η φθίνουσα # ακολουθία 5066, 5065, ..., 217. Η διαίρεση γράφεται 5066/217. # --------------------------------------------------------------------- # ΑΣΚΗΣΗ 2: Κατασκευή διανυσμάτων # --------------------------------------------------------------------- # 2(a) x <- c(2, 4, 6, 8, 1, 3, 5, 7) # 2(b) y = (1,3,5,...,99,97,...,1) y <- c(seq(1, 99, by = 2), seq(97, 1, by = -2)) # TIP: Το 99 πρέπει να εμφανίζεται μία φορά. # 2(c) n <- length(x) # 8 N <- length(y) # 99 # 2(d) z <- 1:n # 1 2 ... 8 w <- 1:N # 1 2 ... 99 # 2(e) Το x επαναλαμβάνεται N - 4n = 99 - 32 = 67 φορές a <- rep(x, times = N - 4*n) length(a) # 536 (= 8 * 67) # 2(f) q <- rep(c(2, 5, 1), times = c(3, 2, 5)) # TIP: Το times μπορεί να είναι διάνυσμα: κάθε στοιχείο επαναλαμβάνεται # τόσες φορές όσες λέει το αντίστοιχο στοιχείο του times. # Εναλλακτικά: q <- c(2,2,2,5,5,1,1,1,1,1) # --------------------------------------------------------------------- # ΑΣΚΗΣΗ 3: Πράξεις Διανυσμάτων # --------------------------------------------------------------------- # 3(a) x + z # 3 6 9 12 6 9 12 15 x - z # 1 2 3 4 -4 -3 -2 -1 x / z # 2.0 2.0 2.0 2.0 0.2 0.5 0.714 0.875 z * x # 2 8 18 32 5 18 35 56 x ^ z # 2 16 216 4096 1 729 78125 5764801 z ^ x # 1 16 729 65536 5 216 16807 2097152 x %% z # 0 0 0 0 1 3 5 7 (υπόλοιπο) x %/% z # 2 2 2 2 0 0 0 0 (πηλίκο) # TIP: Οι πράξεις γίνονται στοιχείο προς στοιχείο (element-wise). # 3(b) 3 * x + z # 7 14 21 28 8 15 22 29 3 * (x + z) # 9 18 27 36 18 27 36 45 3 + x / z # 5 5 5 5 3.2 3.5 3.714 3.875 (3 + z) * x # 8 20 36 56 8 27 50 77 (x + 5) ^ z # 7 81 1331 28561 7776 262144 ... 5 * z ^ (3 * x) # 5 20480 1937102445 ... (πολύ μεγάλοι αριθμοί) # TIP: Στην R, το 3x είναι συντακτικό λάθος. Γράφουμε 3*x. # TIP: Το ^ έχει μεγαλύτερη προτεραιότητα από το *, άρα το 5z^(3x) # είναι 5*(z^(3*x)) και όχι (5*z)^(3*x). # 3(c) (x: μήκος 8, y: μήκος 99) 3 * x + y # προειδοποίηση (warning), βλ. TIP 3 * (x + y) x ^ y y ^ x + 3 y ^ (x + 3) # TIP (recycling): Το x έχει μήκος 8 και το y μήκος 99. Η R # επαναλαμβάνει το μικρότερο διάνυσμα μέχρι να φτάσει το μήκος του # μεγαλύτερου. Επειδή 99 = 12*8 + 3, δεν χωράει ακριβώς και # εμφανίζεται warning: "longer object length is not a multiple of # shorter object length". Το αποτέλεσμα έχει μήκος 99. # Έλεγχος: (3*x + y)[1:8] == 3*x + y[1:8] # --------------------------------------------------------------------- # ΑΣΚΗΣΗ 4: Επιλογή στοιχείων διανυσμάτων # --------------------------------------------------------------------- x <- c(-4, 7, -1, 0, 5, -6, 2, 3) y <- c( 1, 1, -3, 4, 9, 2, -2, 6) # 4(a) 1ο, 2ο και 6ο στοιχείο του x x[c(1, 2, 6)] # -4 7 -6 # 4(b) Τα τέσσερα πρώτα στοιχεία του y y[1:4] # 1 1 -3 4 (ή head(y, 4)) # 4(c) Οι αρνητικές τιμές του x x[x < 0] # -4 -1 -6 # 4(d) Όλα τα στοιχεία του x εκτός από το 3ο x[-3] # -4 7 0 5 -6 2 3 # TIP: Οι αρνητικοί δείκτες αποκλείουν στοιχεία. Δεν μπορείς να # ανακατέψεις θετικούς και αρνητικούς δείκτες, π.χ. x[c(-1, 2)]. # 4(e) Αρνητικές τιμές του x, όπου το αντίστοιχο y είναι διάφορο του 1 x[x < 0 & y != 1] # -1 -6 # (το -4 αποκλείεται γιατί το αντίστοιχο y είναι 1) # 4(f) Αρνητικές τιμές του y, ή τιμές του y όπου το αντίστοιχο x <= 0 y[y < 0 | x <= 0] # 1 -3 4 2 -2 # 4(g) Το διάνυσμα (x1, x2, x1, x2) x[c(1, 2, 1, 2)] # -4 7 -4 7 (ή rep(x[1:2], times = 2)) # --------------------------------------------------------------------- # ΑΣΚΗΣΗ 5: Υπολογισμός Αθροίσματος # --------------------------------------------------------------------- # 5(a) 100 τυχαίοι ακέραιοι από το 1:100, με επανάθεση set.seed(123) # προαιρετικό: ίδια τυχαία δείγματα σε κάθε εκτέλεση X <- sample(100, replace = TRUE) # TIP: Προτίμησε TRUE αντί για T. Το T είναι απλό αντικείμενο που # μπορεί να αλλάξει, ενώ το TRUE είναι δεσμευμένη λέξη. # 5(b) Αύξουσα σειρά X <- sort(X) # X[1] = ελάχιστο, X[n] = μέγιστο # 5(c) d = sum_{i=1}^{n} c_i * X_(i) n <- length(X) # 100 i <- 1:n ci <- sqrt((n - i)/n) - sqrt((n - i + 1)/n) - 1/n d <- sum(ci * X) d # αρνητικός αριθμός (όλα τα ci < 0 και X > 0) # Έλεγχος αν γράψαμε σωστά το ci: # οι όροι με τις ρίζες αλληλοαναιρούνται και δίνουν -1 # και το -1/n προστίθεται n φορές (δίνει -1), άρα sum(ci) = -2 sum(ci) # -2 # TIP: Μην ονομάσεις το διάνυσμα "c", γιατί είναι το όνομα της συνάρτησης c(). # TIP: Το ^(1/2) θέλει παρενθέσεις, ενώ το x^1/2 είναι το (x^1)/2. # Εδώ το ^(1/2) γράφεται πιο απλά sqrt().