Διάλεξη 8 / Διάλεξη 8 / σύντομη περιγραφή - Καρατζάς Κωνσταντίνος (ΑΡΙΣΤΟΤΕΛΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΟΝΙΚΗΣ, 2015)
σύντομη περιγραφή: Είμαστε εδώ για να δούμε περισσότερα πράγματα σε σχέση με την υπολογιστική πολυπλοκότητα αρχικά, όπως επίσης και σχετικά με την υπολογιστική πολυπλοκότητα σχετικά με την υπολογιστική πολυπλοκότητα. Αυτό είναι το πρόγραμμα. Αυτό είναι το πρόγραμμα. Αυτό είναι το πρόγραμμα. Αυτό είναι το πρόγραμμα. Αυτό είναι το πρόγραμμα. Αυτό είναι το πρόγραμμα. Θα δείξουμε την υπόλογιστική πολυπλοκότητα αρχικά, όπως επίσης και σε σχέση με αναδρομικές συναρτήσεις και θα το κάνουμε αυτό πιάνοντας το νήμα από το σημείο όπου το αφήσαμε την προηγούμενη φορά. Θα θυμάστε βέβαια την πολύ γνωστή και πλέον, θα το, λοιπόν, αγαπητή ακολουθεί αφιμβονάτση, η οποία εξυπηρετεί πάρα πολύ καλά τους σκοπούς μας, διότι μας δίνει τη δυνατότητα να δούμε θέματα και αναδρομικότητας, αλλά και πολυπλοκότητας. Έτσι, λοιπόν, έχοντας κατά νου αυτά που είχαμε αναφέρει και θα επαναλάβω ως προς τη στοιχειώδη πράξη, μπορούμε να επιχειρήσουμε το να υπολογίσουμε τον αριθμό των στοιχειωδών πράξεων που απαιτούνται για να υπολογίσουμε τους όρους της ακολουθίας, όταν ο υπολογισμός αυτός γίνεται με διάφορες στρατηγικές. Η στοιχειώδης πράξης, λοιπόν, είναι οποιαδήποτε διαδικασία θεωρούμε ότι είναι ανοφραγμένη ως προς τον χρόνο, όπως λέμε, πράγμα που σημαίνει ότι δεν μπορεί η τιμή της να λάβει μία τιμή μεγαλύτερη από μία μέγιστη η οποία καθορίζεται από το περιεχόμενο των πράξεων και από το είδος των πράξεων. Έτσι, λοιπόν, για παράδειγμα, μία πρόσθεση δύο αριθμών, όσο μεγάλο κι αν αυτή είναι, μπορεί, μεν να μην απαιτεί τον ίδιο χρόνο, για το μέγεθος των αριθμών παίζει κάποιον ρόλο, αλλά σε κάθε περίπτωση θεωρούμε ότι σε κάθε υπολογιστικό σύστημα είναι μία πράξη ανοφραγμένη, άρα δεν μπορεί να ξεπεράσει ένα συγκεκριμένο μέγιστο χρόνο εκτέλεσης. Τέτοια στοιχειώδης πράξης είναι οι αναθέσεις τιμής, άρα οπουδήποτε βλέπουμε μία ανάθεση τιμής, αυτό είναι μία στοιχειώδης πράξη. Οπουδήποτε βλέπουμε να επιτελείται μία από τις τέσσερις βασικές αλγευρικές πράξεις, αυτό συνιστά στοιχειώδη πράξη, συγκρίσεις και απλές συναρτήσεις όπως υπολογισμός ρυζών και τα λοιπά. Επίσης, εντολές διακλάδωσης. Όλα αυτά είναι στοιχειώδης πράξης. Οπότε, λοιπόν, εάν έχω ξαναλέω μία εντολή ή μία ενότητα εντολών, η οποία εκτελεί ένα υπολογιστικό έργο, ο χρόνος εκτέλεσης του οποίου είναι άνοφραγμένος, άρα δεν μπορεί να μεγαλώνει η αυθαίρετα, και ο χρόνος του οποίου, εκτέλεσης του οποίου, είναι ανεξάρτητος από το μέγεθος του έργου, τότε αυτό, και από το μέγεθος του προβλήματος, λοιπόν, τότε αυτό το ονομάζουμε στοιχειώδη υπολογιστική πράξη. Στην περίπτωση, λοιπόν, του Φιμπονάτση, εάν προχωρήσω σε μία υλοποίηση, όπως αυτή που είδαμε την προηγούμενη φορά και ελπίζω ότι τώρα την βλέπουμε με διαφορετικό μάτι, μπορούμε να υπολογίσουμε τον αριθμό των στοιχειωτών πράξεων. Συγκεκριμένα, εδώ έχουμε για κάθε ν, μία σύγκριση ως προς το αν το ν είναι μηδέν, ώστε ο όρος να λάβει την τιμή μηδέν, μία δεύτερη σύγκριση ως προς το αν το ν είναι ένα, έτσι ώστε ο όρος να λάβει την τιμή ένα. Και από εκεί και πέρα ο κάθε όρος υπολογίζεται αναδρομικά, υπολογίζεται από την συνάρτηση αυτή με τρόπο τέτοιο ώστε η συνάρτηση καλεί τον εαυτό της και υπολογίζεται από τα προηγούμενα δήματά της, τις προηγούμενες τιμές της, και υπολογίζεται αναδρομικά από τις δύο προηγούμενες τιμές. Έτσι λοιπόν λέμε ότι κάθε όρος αποτελείται από τον προηγούμενο στην τον προ-προηγούμενο. Άρα το πρόβλημα μετακυλίεται στο να υπολογίσουμε τον προηγούμενο και τον προ-προηγούμενο. Και για κάθε έναν από αυτούς τους όρους το πρόβλημα μετακυλίεται στο να υπολογίσουμε τον προ-προ-προηγούμενο και τον προ-προ-προ-προ-προηγούμενο. Και πάει λέγοντας έως ότου όλο αυτό το πράγμα αποδομηθεί σε ένα σύνολο από προσθέσεις που δεν θα περιλαμβάνει τίποτα άλλο παρά μόνο τους δύο όρους για τους οποίους έχουμε απόλυτη βεβαιότητα. Έτσι λοιπόν, μία σύγκριση εδώ, μία στοιχειώδης πράξη. Δεύτερη σύγκριση, δεύτερη στοιχειώδης πράξη. Ένας υπολογισμός, στοιχειώδης πράξη. Ένας υπολογισμός, μια άλλη στοιχειώδης πράξη. Και εδώ κανονικά έχουμε μία πρόσθεση που είναι μία στοιχειώδης πράξη. Για να δούμε αναλυτικά λοιπόν, το είχαμε κάνει και την προηγούμενη φορά αλλά πιστεύω ότι τώρα είμαστε σε θέση να το δούμε σε μεγαλύτερο βάθος και να εμπεδώσουμε καλύτερα τη διαδικασία υπολογισμού. Για να δούμε έναν τρόπο εκτίμησης του χρόνου υπολογισμού. Πρακτικά αυτό τι σημαίνει. Εάν κάθε βήμα μου κοστίζει, για παράδειγμα, ένα δευτερόλεπτο. Πόσα δευτερόλεπτα συνολικά χρειάζομαι αν θέλω να υπολογίσω τον 10ο όρο, τον 20ο όρο, τον 308ο όρο, τον όρο χίλια, τον όρο δέκα χιλιάδες. Αυτό που συμβαίνει είναι ότι, όπως είπαμε, έχω χονδροειδός και θα πω γιατί αναφέρω το χονδροειδός, τρεις στοιχειώδης πράξη σε κάθε βήμα. Άρα λοιπόν, αν θέλω να υπολογίσω τον χρόνο τάφ, που απαιτείται για να υπολογιστεί ο νιωστός όρος, τότε αυτός ο χρόνος είναι ίσως με τον χρόνο που απαιτείται για την εκτέλεση των τριών στοιχειοδών βημάτων, μία, δύο συγκρίσεις και μία πρόσθεση, συν τον χρόνο που απαιτεί ο υπολογισμός του προηγούμενου όρου και ο υπολογισμός του προ-προηγούμενου όρου. Όμως, ο χρόνος του προηγούμενου όρου, με την ίδια λογική, θέλει, για να υπολογιστεί, θα πρέπει να λάβει υπόψη τα τρία βήματα που θέλει ο καθόρος, έτσι δεν είναι, συν τους δύο προηγούμενους, που οι δύο προηγούμενοι του ν-1 είναι ο χρόνος που απαιτείται για τον υπολογισμό του ν-2 όρου και ο όρος που απαιτείται για τον υπολογισμό του όρου ν-3. Και, κατά αντιστοιχία, θα έλεγα, ότι και για τον δεύτερο όρο του αθρίσματός μας ο χρόνος υπολογισμού είναι αυτός που απαιτείται για να μπορέσουν να εκτελεστούν τα τρία της τρεις στοιχειών της πράξης και μετά σε αυτό θα πρέπει να προσθέσουμε το χρόνο υπολογισμού του προηγούμενου όρου και του προ-προηγούμενου όρου. Εδώ ήδη, αυτό που παρατηρούμε είναι ότι το τρία είναι ένας όρος που μπορώ να θεωρήσω ότι πολλαπλασιάζεται με το δύστημη 0. Και εδώ το τρία εμφανίζεται δύο φορές. Είναι λοιπόν ένας όρος που εμφανίζεται πολλαπλασιασμένος με το δύο εις την πρώτη. Από τη στιγμή που εδώ έχουμε ένα τριάρι, εδώ έχουμε δύο τριάρι. Άρα, κάθε χρόνος τας γεννά ένα τριάρι, σωστά, συν τους χρόνους των προηγούμενων δημάτων. Είπα αυτήν την έννοια, εδώ θα έχω τρία συν τάφτου νίπλυν τρία συν τάφτου νίπλυν τέσσερα. Όμια εδώ τρία συν, δεν γράφω τους όρους. Όμια εδώ τρία συν όροι και εδώ τρία συν όροι. Άρα, στην αμέσως επόμενη φάση αποδόμησης, τα τριάρια γίνονται ένα, δύο, τρία, τέσσερα. Έχω λοιπόν τρία επί δύο ή στο τετράγωνο τριάρια. Και αυτό ουσιαστικά το πράγμα θα συνεχιστεί έως ότου σταματήσω να έχω άλλους όρους. Από τη στιγμή που, Γιάννη, ξεκινώ με εκθέτη μηδέν, άρα θα πάω σε νίπλυν ένα καταβάση εκφέτες. Άρα, χονδρικά, εδώ θα έχω τελικά, όταν θα υπολογίσω όλους τους όρους, έναν αριθμό που είναι ίσως μετρία επί δύο ή στινή, περίπου, στοιχειώδης πράξης. Υπό αυτήν την έννοια, λοιπόν, περίπου λέω, έτσι, υπό αυτήν την έννοια, λοιπόν, αυτού του είδους ο υπολογισμός, θέλει, ξαναλέω, περίπου τρία επί δύο ιστινείς στιχειώδης πράξης, άρα, χονδρικά, περίπου δύο ιστινείς στιχειώδης πράξης. Ξανά. Ο κάθε όρος, είδαμε από τον τρόπο υπολογισμού, ότι θέλει μία σύγκριση, δύο συγκρίσεις, μία πρόσθεση. Ο κάθε όρος θέλει αυτές τις τρεις στιχειώδεις πράξης. Συν ό,τι χρειάζονται οι δύο προηγούμενοι όροι που μπαίνουν στο παιχνίδι που δημιουργείται το άθλησμα. Να, λοιπόν, οι τρεις στιχειώδεις πράξης και οι δύο προηγούμενοι όροι. Αλλά κάθε όρος, προφανώς, έχει τις τρεις στιχειώδεις πράξης και τους δύο προηγούμενους όρους. Και αυτό συνεχίζεται, έως ότου δεν έχω κανέναν άλλον όρο. Αυτό, λοιπόν, θα γίνει έτσι ώστε, προφανώς, αρχικά, να έχω τρία επί δύο στην μηδενική στιχειώδεις πράξης συν όσες απαιτούν οι δύο όροι. Τρία επί δύο στην πρώτη, τρία επί δύο στην δευτέρα και καταλήγω να έχω την εκτίμηση του τρία επί δύο ή στην μη, περίπου, στιχειώδεις πράξης. Αυτός, λοιπόν, είναι ο μεγάλος όρος που εξαρτάται από το μέγεθος του προβλήματος. Τι προσπαθούμε εμείς να βρούμε τόση ώρα? Προσπαθούμε να βρούμε έναν όρο σε αυτή την παράσταση που μας δείχνει τον αριθμό των στιχειωτών πράξεων που εξαρτάται από το μέγεθος του προβλήματος. Ποιο είναι το μέγεθος του προβλήματος? Το ν. Αν μας δώσουν ν ίσον πέντε, σημαίνει ότι θέλω τον πέμπτο φιβονάτσι. Αν μας δώσουν ν ίσον πενήντα, θέλω τον πεντηκοστό φιβονάτσι. Τελείως διαφορετική η ανάγκη σε στιχειώδεις πράξης. Άλλο το 2 στην πέμπτη, άλλο το 2 στην πεντηκοστή. Γενικά, λοιπόν, ο όρος ο οποίος επηρεάζει, καθορίζει, μάλλον, τον αριθμό των στιχειωτών πράξεων είναι ο 2 στην ν. Γι' αυτό και λέμε ότι σε αυτή την περίπτωση η υπολογιστική πολυπλοκότητα είναι μεγάλο όμικρον του 2 στην ν, όπου με μεγάλο όμικρον συμβολίζουμε την πολυπλοκότητα υπολογιστικού χρόνου και, πιο γενικά, την κατηγορία συναρτήσεων πολυπλοκοτήτων, εδώ υπολογιστικού χρόνου. Έτσι, είμαστε βέβαιοι ότι από ένα ν και πάνω, ο αριθμός των στιχειωδών πράξεων είναι τόσο μεγάλος, ώστε να καθίσταται απαγορευτικός ο υπολογισμός του αριθμού φιβονάτσι. Και, έτσι, είμαστε βέβαιοι ότι αυτός ο τρόπος υπολογισμού είναι πραγματικά πάρα πολύ κοστοβόρος από πλευράς υπολογιστικών πράξεων. Μπορεί η ποσότητα του χρόνου που απαιτείται για κάθε στοιχειώδη υπολογιστική πράξη να μας φαίνεται πολύ μικρή και να είναι, το παράδειγμα πάλι της συχνότητας των επεξεργαστών, ξανά, πείτε μου μια συχνότητα επεξεργαστή στο σπίτι σας, 3 ΓΧ, 2 ΓΧ, αυτό σημαίνει δύο τι, πόσες πράξεις, έτσι, εκατομμύρια πράξεις στο δευτερόλεπτο. Α, φαίνεται ένας πολύ μεγάλος αριθμός. Το 2 εις την 64, το παράδειγμα της Κακέρας, είπαμε ότι είναι ένας αριθμός τόσο μεγάλος, ώστε να θεωρείτε ότι ξεπερνά τον αριθμό των κόκκων άμου στη Γη. Είναι μη μαχητό το μέγεθος. Αυτό, λοιπόν, είναι ένα πολύ καλό παράδειγμα αλγορύθμου που έχει την περίφημη εκθετική πολυπλοκότητα, που είναι αυτή που απευχόμαστε. Την θέλουμε μια τόσο βαριά από πλευράς υπολογιστική χρόνου διαδικασία. Όχι. Άρα, προφανώς, δεν θέλουμε να χρησιμοποιούμε τέτοιους αλγορύθμους. Το πρόβλημα είναι, βέβαια, θα μου πείτε τι κάνεις όταν δεν έχεις άλλους. Και αυτό το ερώτημα γεννάται στο παράδειγμα του περιοδεύοντος πολιτή που είχαμε την προηγούμενη φορά, το οποίο είναι εκθετικής υπολογιστικής πολυπλοκότητας και για το οποίο δεν υπάρχει εναλλακτική λύση παρά μόνο κάποιοι αλγόριθμοι ευρεστικού χαρακτήρα. Αυτή, λοιπόν, η πρώτη υλοποίηση βασίζεται στην έννοια της αναδρομικότητας και στο συγκεκριμένο παράδειγμα οδηγεί σε πολύ μεγάλους χρόνους εκτέλεσης σε πολύ μεγάλη υπολογιστική πολυπλοκότητα. Έχω άλλη λύση. Θα θυμάστε ότι προφανώς και είχαμε δει και μια δεύτερη λύση, η οποία έχει μία προσέγγιση που είναι διαφορετική. Δηλαδή, κοιτάξτε, εδώ έχω μία στοιχειώδη πράξη για τον όρο 0 και μία δεύτερη για τον όρο 1. Έτσι δεν είναι, δεν είναι ανάθεση τιμής. Σύμφωνο με τον ορισμό που ανέφερα στην αρχή, η ανάθεση τιμής συνιστά υπολογιστική πράξη. Είναι δύο και από εκεί και πέρα για κάθε ν. Τι κάνω? Για κάθε ν χτίζω τους όρους μου. Αυτό τι σημαίνει? Αυτό σημαίνει ότι θέλω δύο ελέγχους και μετά η κάθε επανάληψη πόσες φορές θα εκτελεστεί? Μία φορά. Άρα πόσες πράξεις έχω εδώ μέσα? Το πακέτο των πράξεων της κάθε επανάληψης. Πόσες επαναλήψεις? Νι. Συνολικά, λοιπόν, πόσες στοιχειώδεις υπολογιστικές πράξεις, χοντρικά και κατεκτήμηση, θα έχω, πόσες επαναλήψεις θα έχω, πόσες πράξεις, χοντρικά και κατεκτήμηση, θα έχω, θα έχω δύο συν νοιπλυν δύο, γιατί θα ξεκινήσω από το δύο και μετά, έτσι δεν είναι. Συμφωνούμε, λοιπόν, ότι εδώ θα έχω νοιπλυν δύο συν δύο υπολογιστικές πράξεις. Γενικά, λοιπόν, εδώ θα έχω έναν αριθμό στοιχειών των πράξεων, που θα είναι ίσως περίπου με το ν. Αυτό τι σημαίνει, ότι στο δεύτερο παράδειγμα, έχω μεγάλο όμικρον του ν υπολογιστική πολυπλοκότητα. Άρα, ενώ στην πρώτη περίπτωση χρειάζομαι εκθετικό χρόνο, στη δεύτερη περίπτωση χρειάζομαι χρόνο γραμμικό. Και προφανώς η διαφορά είναι ηλικιώδης, είναι κολοσιαία. Έτσι, εδώ έχω τη δυνατότητα, χτίζοντας ακριβώς τους όρους, για να υπολογίσω τον όρο 5, έχω υπολογίσει ήδη τον όρο 4, άρα έχω υπολογίσει ήδη τον όρο 3, ο οποίος πατάς τους γνωστούς 2 στον όρο 2, ο οποίος πατάς τους 1 και 0. Έτσι δεν είναι. Άρα, κάθε καινούργιος όρος, ποια είναι η διαφορά σε σχέση με την προηγούμενη αναδρομική? Στην αναδρομική, κάθε φορά υπολογίζονται όλοι οι προηγούμενοι όροι. Προσέξτετε. Η αναδρομική κάθε φορά υπολογίζει όλους τους προηγούμενους, δεν θυμάται τίποτα από τους προηγούμενους όρους. Γι' αυτό και ο χρόνος καταλήγει να είναι πάρα πολύ μεγάλος, προφανώς. Ενώ εδώ, κάθε φορά που υπολογίζω έναν όρο, τον χρησιμοποιώ για να πάω στην επόμενη. Η διαφορά είναι, λοιπόν, συνδεκτικά υπέρ αυτής της πολυπλοκότητας, που είναι γραμμική και ανήκει γενικά, επειδή η γραμμική συνάρτηση είναι μερική περίπτωση της πολυονομικής, ας πούμε, μορφής συναρτήσεων, θεωρούμε ότι είναι μια συνάρτηση πολυονομικής πολυπλοκότητας. Και είναι αυτό που αποζητούμε γενικά. Αποζητούμε αλγορύθμους που να έχουν πολυονομική πολυπλοκότητα. Κάποιες ερωτήσεις εδώ, κάποιες διευκρινήσεις που θα θέλετε να δώσουμε. Παρακαλώ. Είναι, ουσιαστικά, η έννοια της αναδρομικότητας. Δηλαδή, ρωτά ο συναδερφός σας, πώς θα δουλέψει, τελικά. Λέμε στην Φιμπονάτση, υπολόγησέ μου την Φίμπο, ας την πούμε έτσι, του πέντε. Κοιτάζει και λέει, θέλω την Φίμπο του πέντε, θέλω την Φίμπο του τέσσερα, του τρία, του δύο, του ένα, της βάζει όλες στη στιά, της αναλύει. Και μετά παίρνει κάθε μία, έχοντάς τη στη μνήμη του. Παίρνει κάθε μία, έχει σπάσει λοιπόν όλο το άθρο. Και λέει, για την τέσσερα, την έχω την τέσσερα, όχι. Για την τέσσερα, θέλω την τρία, την δύο, την ένα και τα μηδέν. Την αναλύει και αυτή, αναλύει και τη δεύτερη. Κάθε φορά, λοιπόν, που ανατρέχει ανάδρομα, πηγαίνει πίσω στην πορεία του υπολογισμού. Ενώ υπολογισμός θα έπρεπε να πηγαίνει μπροστά, εδώ πηγαίνει μπροστα πίσω και υπολογίζει κάθε όρο, αναλύοντάς το συνολικά σε όλα τα θρίσματα, έως ότι φτάσει στο μηδέν και ένα. Όλα αυτά θα πρέπει να τα έχεις στη μνήμη του, διαθέσιμα. Και αυτό, παρεπιπτόντως, είναι και ένα από τα σημεία, τα κρίσιμα. Για αυτό το λόγο στο MATLAB υπάρχει και ένα, όχι μόνο στο MATLAB, σε όλα τα υπολογιστικά περιβάλλοντα, υπάρχει ένας άλλος περιορισμός που δεν σας έχω αναφέρει. Ο περιορισμός μνήμης, όταν κάνουμε αναδρομικούς υπολογισμούς. Γιατί, για να υπολογίσει τον πέμπτο όρο, θα τον σπάσεις σε όλες τους όρους, έως ότι φτάσεις σε μηδέν και ένα. Και για κάθε έναν από αυτούς τους όρους του αθρίσματος που συνιστά τον όρο πέντε, θα κάνει την ίδια δουλειά. Όλα αυτά τα αθρίσματα τα έχει φορτωμένα στη μνήμη του. Άρα λοιπόν, προφανώς κάποια στιγμή μπορεί να υπερχυλίσει η μνήμη, να φτάσει στο επίπεδο του να μην έχει επαρκή ποσότητα μνήμης. Για αυτό και το MATLAB έχει έναν αριθμό χρήσεων αναδρομικών συναρτήσεων. Δεν μπορείς να πας πίσω, παρ' ισότερα από πεντακόσια βήματα υπολογισμού, πεντακόσια όρους πίσω. Μπορείς όμως αυτό να το αλλάξεις. Έχει έναν διακόπτη που σου επιτρέπει να αλλάξεις αυτόν τον όρο. Άρα με αυτόν τον τρόπο σωστικά συμβαίνει. Αυτό, η επάντηση του ερώτημά σου, λοιπόν, είναι ότι όλα αυτά ανοίγουν στη μνήμη και είναι ανοιχτά ερωτήματα που πρέπει να καλυφθούν υπολογίζοντας τον καθεόρο. Επόμενο ερώτημα. Οπότε, θυμάστε ότι όταν το είδαμε αυτό το παράδειγμα του υπολογισμού της ακολουθίας Φιγονάτση, σας είχα πει ότι υπάρχει και ένας καλύτερος τρόπος. Δεν ξέρω αν κάποια ή κάποια το έψαξε το όλο θέμα για να δει εάν όντως έτσι είναι ή εάν ήθελα να σας παραπλανήσω. Κάτι που δεν μπορεί να αποκλειστεί σε αυτή την κατάσταση που βρισκόμαστε. Έτσι, η εκπαιδευτική διαδικασία χρησιμοποιεί, μετέρχεται κάθε μέσο. Παραπλάνηση, αποπλάνηση, όλα είναι μέρος του παιχνιδιού. Οπότε, λοιπόν, είναι όντως έτσι. Υπάρχει, δηλαδή, καλύτερος τρόπος από πλευράς υπολογιστικής πολυπλοκότητας για τον υπολογισμό των όρων της ακολουθίας Φιγονάτση. Επειδή δεν βλέπω να υπάρχει απάντηση, θα σας δώσω εγώ μια κατεύθυνση και θα την δούμε αυτή. Εάν παρατηρήσουμε πως προφανώς ισχύει η πρώτη αυτή σχέση, ο πρώτος όρος είναι ίσως με τον πρώτο όρο, τι μας λες τώρα, πρωί-πρωί. Και ο δεύτερος όρος είναι προφανώς το άθλισμα του πρώτου και του μηδενικού όρου. Αλλά, όμως, αυτό γράφεται με τον εξής τρόπο. Αχα! Ξαφνικά στο παιχνίδι μπήκε ένας τετραγωνικός πίνακας. Και αυτό κάνει τα πράγματα ενδιαφέροντα για ποιον τετράγωνο θα είναι. Αν δεν έχουμε τετράγωνο, θα έχουμε τετράγωνο. Αν δεν έχουμε τετράγωνο, θα έχουμε τετράγωνο. Αν δεν έχουμε τετράγωνο, θα έχουμε τετράγωνο. Αν δεν έχουμε τετράγωνο, θα έχουμε τετράγωνο. Αν δεν έχουμε τετράγωνο, θα έχουμε τετράγωνο. Και αυτό κάνει τα πράγματα ενδιαφέροντα για ποιον λόγο. Διότι για τον επόμενο όρο θα ισχύει αφού 2F1 θα είναι ίσο με το 0.1.1.1 επί F1F0, δηλαδή θα είναι ίσο με 0.1.1.1 στο τετράγωνο F0F1. Άρα, γενικά, μπορώ να γράψω ότι ο νιωστός και ο νης είναι ένα όρος έχουν την εξής πολύ ωραία σχέση με τους αρχικούς όρους των οποίων τις στιγμές γνωρίζουμε. Είναι αυτός ο τετραγωνικός πίνακα συστηνή επί το διάνυσμα των τιμών των 2F1. Οπότε αυτή η σχέση... Ας βάλουμε και λίγο χρώμα στη ζωή μας. Αυτή η σχέση είναι μια σχέση που μπορεί να μας βοηθήσει να υπολογίσουμε κάθε όρο, διότι γνωρίζουμε τον 0 και τον 1. Αλλά η κριτική εδώ θα μπορούσε και θα έπρεπε και είναι ότι, ναι, και πάλι δεν κερδίζω κάτι. Δηλαδή, υψώνω σε δύναμη, άρα για να υπολογίσω, ας πούμε, τον νιωστό όρο, πρέπει να υπολογίσω την νιωστή δύναμη. Η νιωστή δύναμη είναι μια πράξη που συνεπάγεται ενή πολλαπλασιασμούς. Άρα, υπό αυτήν την έννοια, πάλι νι είναι η υπολογιστική πολυπλοκότητα. 0, 1, 1, 1 επάνω, όπως το έχω γράψει σε όλα τα υπόλοιπα σημεία. Να δω. Αυτό είναι το F1, το F βεβαίως. Και εγώ τεχω λάθη. Είναι ανάποδα. F1, F2. F2, F3. Και F, μη F, μη συν 1, και έτσι με τη βοήθειά σας το διόρθωσα. Σωστά είχα στο χαρτί μου, λάθος τα αντέγραψε. Άρα λοιπόν, βλέπουμε μια σχέση, η οποία οδηγεί, στον υπολογίζουμε εύκολα, τους όρους. Ξανά, όμως, λέω ότι αυτή η σχέση δεν φαίνεται να έχει ένα στρατηγικό πλεονέκτημα, δεν θέλουμε ως πλεονέκτημα. Δηλαδή, στις λιγότερες στοιχειώδεις πράξεις, πολλαπλασιασμούς έχει. Άρα, ο νιωστός Φιμπονάτσι μη πολλαπλασιασμούς δεν θέλει. Συμφωνούμε μέχρι εδώ. Άρα το ερώτημα τώρα γίνεται διαφορετικό. Όταν έχω μη πολλαπλασιασμούς, όταν έχω γενικά μια ύψωση σε δύναμη, λοιπόν, ποια είναι οι γνώμεις του κοινού. Ξαναλέω, όταν έχω μη πολλαπλασιασμούς, μπορώ να κοινώ τη σχέση με έναν τρόπο που να μην είναι συνάρτηση του νι, αλλά να είναι συνάρτηση μιας άλλης παράστασης που να οδηγεί σε καλύτερο υπολογιστικό χρόνο. Ξανά. Είχαμε δει ότι η πρωτιλοποίηση του Φιμπονάτσι είναι υπολογιστικό χρόνο. Καταστροφή. Η δεύτερη υλοποιήσει οδηγεί σε γραμμικό χρόνο. Πολύ ωραία φαίνεται να είναι τα πράγματα. Και αναρωτηθήκαμε εάν υπάρχει καλύτερη περίπτωση από τη γραμμική. Μπαίνει στο παιχνίδι ένας τρόπος υπολογισμού και ευχαριστώ που είσαστε προσεκτικοί και με διορθώσατε εδώ, όπου οι όροι Φιμπονάτσι βρίσκονται από την ύψωση σε δύναμη ενός πίνακα. Δεν φαίνεται να έχει πλεονέκτημα μέχρι στιγμής, εκτός εάν μπορέσουμε την ύψωση σε δύναμη να την κάνουμε με έναν τρόπο πιο αποτελεσματικό από αυτόν που έχουμε στο μυαλό μας. Για να δούμε, λοιπόν, κάτι. Έστω ότι θέλω, κρατάμε αυτό το αποτέλεσμα στο μυαλό μας και για να πάμε στο πρόβλημα της ύψωσης σε δύναμη. Αυτό καθ' αυτό. Έστω ότι θέλω να υπολογίσω το χ στη ν, όπου χ είναι αριθμός πραγματικός και ν αριθμός ακέραιος. Ένας απλός τρόπος, και γράφω ένα πρόγραμμα που προχείρως μπορεί ο καθένας να δημιουργήσει, να ορίσω μια αρχική τιμή αρχικοποιώ πάντοτε. Έτσι, εντάξει. Δηλαδή το α είναι χ και το β είναι ν. Και τώρα να κάνω το εξής. Και θα γράψω αυτή τη δομή με άλλο χρώμα σε μια προσπάθεια να την κάνω... στοιχείο ενδιαφέροντος. Όσο το μπ είναι μεγαλύτερο από το μηδέν, προσέξτε έναν τρόπο υπολογισμού της έκθεσης σε δύναμη. Γράφω και εξηγώ. Εάν το μόντ του μπ, δύο ταυτίζεται με το μηδέν, τότε το μπ είναι ίσο με μπ διά δύο και το α είναι α επί ν. Διάφορετικά, το μπ είναι μπ'1 και το ίντ power έχει την προηγούμενη τιμή επί το α. Εδώ θέλω α. End. Για να τα δούμε, λοιπόν. Και έχω, μου φαίνεται κάπου, ή ελπίζω ότι έχω κρατήσει κάπου, ένα παράδειγμα υπολογισμού. Βοηθά. Για να δούμε τις αρχικές τιμές του ίντ power, του α και του μπ, όταν θέλω να υπολογίσω το χ' στην οχδόη. Ξεκινώ την εκτέλεση. Αρχική τιμή του ίντ power, ένα, σωστά. χ' στην οχδόη, άρα το ν είναι 8. Άρα το α τι τιμή φέρει, α τι τιμή φέρει, χ. Το β τι τιμή φέρει, 8. Είναι το β μεγαλύτερο από το μηδέν. Όσο το β είναι μεγαλύτερο από το μηδέν, άρα είμαι σε αυτή τη διακλάδωση, είναι το αποτέλεσμα της ακέραιας διέρεσης του β με το 2-0. Βεβαίως, τότε το καινούργιο β είναι το προηγούμενο 2-2. Το καινούργιο α είναι το προηγούμενο επί τον εαυτό του. Άρα πόσο είναι? Χ τετράγωνο. Νέα τιμή 4. Είναι μεγαλύτερο από το μηδέν. Υσχύει και πάλι ότι το ακέραιο υπόλοιπο του β, τη διαίρεση του β με το 2 είναι μηδέν. Οπότε η νέα τιμή του β είναι ίση με 2. Ενώ ταυτόχρονα το καινούργιο χ και το καινούργιο α τώρα πόσο είναι? Το προηγούμενο πόσο ήταν? Εδώ θέλω την προσοχή σας. Το προηγούμενο α πόσο ήταν? Κοιτάτε τον πίνακα. Η αμέσως προηγούμενη τιμή του α. Τι βλέπουμε εδώ? Χ τετράγωνο. Άρα η νέα τιμή του α είναι η προηγούμενη επί τον εαυτό της. Δηλαδή, χ τετάρτης. Το in power παραμένει πάντοτε 1. Νέα τιμή του β2. Υσχύει το while. Το ακέραιο υπόλοιπο της διαίρεσης του 2 με το 2 είναι μηδέν. Άρα η νέα τιμή του τι γίνεται? 1. Η νέα τιμή του α είναι πόση? Προηγούμενη, χ τετάρτης. Νέα τιμή, η προηγούμενη επί τον εαυτό της. Χ τετάρτης επί χ τετάρτης. Άρα, χ οκδόης. In power, πάλι 1. Πηγαίνω τώρα και βλέπω ότι το β είναι 1, πάλι μεγαλύτερο από το μηδέν. Είναι το ακέραιο υπόλοιπο του β με το 2 ίσο με το μηδέν. Όχι. Άρα το β θα γίνει β-1. Δηλαδή πόσο? Μηδέν. Και το in power θα γίνει in power επί α. Πόσο είναι το in power? 1. Πόσο είναι το α? Χ οκδόης. Χ οκδόης παραμένει το in power, χ οκδόης γίνεται το in power, χ οκδόης είναι το α. Το τελικό αποτέλεσμα είναι χ στην οκδόη. Το τελικό αποτέλεσμα είναι χ στην οκδόη. Επειδή ξέρω ότι είναι ένα παράδειγμα λίγο δύσκολο, ας το τρέξουμε και για μία άλλη τιμή. Ξανασβήνω εδώ και γράφω το σύνολο του πίνακα. Τώρα θα υπολογίσουμε ένα άλλο παράδειγμα. Το χ στην εβδόμη. Θα ψάξω να βρω και ένα άλλο χρώμα κυμολίας, μήπως και αυτό κάνει τη δουλειά μας ευκολότερη. Δεν είμαι και πολύ αισιόδοξος, αλλά... Λοιπόν. Χ στην εβδόμη. Οπότε, για να δούμε, οι αρχικά in power, τιμές του α και τιμή του β. Ξεκινώ λοιπόν. Αρχική τιμή. α ίσον χ. Ναι. Ορίστε. Το β είναι... Πόσο εδώ, εσείς κύριοι εκεί. Πόσο είναι το β, αγαπητέ. Πόσο είναι το β. Το β είναι ν. Και το ν είναι 7. Πολύ ωραία. Άρα λοιπόν. Είναι το β μεγαλύτερο από το μηδέν. Προφανώς. Είναι το ακέραιο υπόλοιπο του όταν διαιρείται με το 2 ίσον με το μηδέν. Όχι. Άρα το β θα γίνει β-0. Το β θα γίνει β-1, 6. Και το in power, πόσο θα γίνει... Το in power αρχικά είναι 1, συγγνώμη. Πόσο θα γίνει η προηγούμενη τιμή του, που είναι 1, επί το α, το οποίο είναι χ. Άρα in power χ. Το α παραμένει χ εδώ. Δεν το πειράξαμε. Συμφωνούμε? Επόμενο βήμα τώρα. Το β είναι 6. Προφανώς παραμένει μεγαλύτερο από το μηδέν. Το 2 δεν αφήνει υπόλοιπο. Άρα η νέα του τιμή θα είναι β-2, 3. Η νέα τιμή του α θα είναι η προηγούμενη επί τον εαυτό της. Η προηγούμενη χ επί τον εαυτό της. Άρα χ τετράγωνο. Το in power παραμένει στην ίδια κατάσταση. Άρα προφανώς χ δεν το έχει πειράσει κανένας. Στο επόμενο βήμα το β είναι πάλι μεγαλύτερο από το μηδέν. Όμως δεν διαιρείται τέλεια με το 2. Άρα πηγαίνουμε εδώ. Η νέα του τιμή θα είναι β-1, δηλαδή 2. Και η νέα τιμή του in power θα είναι όποια ήταν πριν. Δηλαδή η προηγούμενη τιμή του in power ήταν χ επί την τιμή του α, η οποία είναι χ τετράγωνο. Άρα εδώ το in power θα γίνει χ τρίτης και το α παραμένει χ τετράγωνο διότι δεν επηρεάστηκε από αυτόν τον υπολογισμό. Για να δούμε τώρα. Εδώ το β είναι 2. Ανήκει στην πρώτη περίπτωση β2 τέλεια διαιρείται. Οπότε η επόμενη τιμή του είναι 1. Η επόμενη τιμή του α είναι η προηγούμενη επί τον εαυτό της. Η προηγούμενη είναι χ τετράγωνο. Επί τον εαυτό της χ τετράγωνο, χ τετάρτης. Και η in power παραμένει εκεί όπου βρισκόταν και προηγουμένως στη χ τρίτης. Και βεβαίως στο επόμενο και τελευταίο όπως φαίνεται βήμα είναι μονός αριθμός, άρα δεν διαιρείται τέλεια με το 2. Οπότε η επόμενη τιμή του θα γίνει 0. Και η in power θα πάρει την τιμή που είχε πριν, χ τρίτης, επί την τιμή που είχε η α πριν, χ τετάρτης. Θα γίνει χ εβδόμις και το α θα παραμείνει χ τετάρτης. Μετά με β στον 0 θα βγει από το while loop. Τελικό αποτέλεσμα υπολογισμού, χ εβδόμις. Με αυτό τον τρόπο τι πετυχαίνω? Θα μου πείτε, δεν μας πείθεις ακόμη και πολύ. Δεν το αγοράζουμε ακόμη αυτό το πράγμα. Πρέπει να σας πείσω, χωρίς να σας ξεγελάσω, αλλά πατώντας πραγματικά γεγονότα, ότι όντως με συμφέρει να κάνω τον υπολογισμό της δύναμης με αυτόν τον τρόπο. Προσέξτε λοιπόν πώς θα το κάνω. Μια άλλη προσέγγιση εδώ. Ας υποθέσουμε, ότι το ν, έτσι όπως πηγαίνει με αυτόν τον αλγόριθμο, είναι πάντοτε άρτιος. Θα μου πείτε, δεν είναι αυτό το πράγμα. Έστω ότι είναι πάντοτε άρτιος. Κάθε φορά που κάνω διαιρέσεις, παραμένει άρτιος. 8, 4, 2 κτλ. και μόνο στο τέλος μία φορά. Άρα, άμα ξεκινήσω από το 80.000, θα έχω όλο άρτιος στη σειρά και μόνο μία φορά θα έχω έναν περιττό, οπότε σαν να είναι άρτιος. Τότε πόσα βήματα συνολικά θέλω, συνολικά θέλω, το σύνολο των βημάτων μου, αν το ν είναι άρτιος, μη άρτιος, το σύνολο των βημάτων μου είναι ίσο με ΚΑΙ με μη δεύτερα. Δηλαδή, κάθε φορά δίχω το μό. Αν το ν είναι περητός τώρα, συνεχώς περητός, ξεκινάω από περητό και πέφτω συνεχώς πάνω σε περητούς. Μα θα μου πείτε πάλι δεν γίνεται, ας το, να το απλοποιήσουμε το πράγμα. Ας το ότι είναι συνεχώς περητός, ν περητός, ν, άνω, κάτω, τελεία, περητός, τότε πρακτικά θέλω ν πλυν μία φορά. Πόσες επαναλήψεις θέλω, ΚΑΙ με ν πλυν 1. Όμως προσέξτε τι γίνεται τώρα. Έχω πει ότι αν το ν είναι συνεχώς άρτιος, θέλω ν δεύτερα βήματα υπολογισμού. Αν το ν είναι συνεχώς περητός, θέλω ν πλυν 1 βήματα υπολογισμού. Ακόμα και όταν είναι άρτιος, συνεχώς, για μεγάλες τιμές του ν, μεγάλες τιμές του ν, το ν 10.000, 20.000, 30.000, 50.000, 1 εκατομμύριο, ό,τι θεωρώ μεγάλες τιμές του ν, δεν ισχύει ότι ν δεύτερα μίον 1 είναι ίσο με ν δεύτερα. Συγγνώμη, όταν το ν είναι περητός, και είπα όταν το ν είναι άρτιος. Όταν το ν είναι περητός, το ν δεύτερα μίον 1 είναι περίπου ν δεύτερα, έτσι δεν είναι. Αν το ν είναι πολύ μεγάλος αριθμός, και γενικά αν το ν είναι πολύ μεγάλος αριθμός, ισχύει αυτό. Συμφωνούμε, εδώ τώρα θέλω τη συμμετοχή σας, είναι έτσι ή όχι. Καμιά αντίρρηση. Δηλαδή λέω ότι αν το ν είναι περητός αριθμός, έτσι, περητός, τότε το ν δεύτερα μίον 1 είναι περίπου ν δεύτερα. Θα μου πείτε κι άρτιος να είναι, το ίδιο ισχύει. Γιατί το λέω όμως για περητούς. Ναι, είναι πολύ μεγάλο, είναι ένα εκατομμύριο. Άρα είναι σαν να λέμε ότι το 500.000 μίον 1 είναι περίπου 500.000. Κοντρικά, έτσι. Αυτό σημαίνει ότι γενικά για μεγάλες τιμές του ν, είπαμε ότι όταν είναι άρτιος τα βήματα είναι ν δεύτερα, όταν είναι περητός είναι ν πλεινένα, έτσι. Που όμως επειδή πάντοτε θα σπάσουν στη μέση είναι πάλι κοντρικά ίσομε ν δεύτερα, άρα για μεγάλες τιμές του ν, αυτός εδώ ο αλγόριθμος συγκλίνει στο να υπολογίζει το τελικό αποτέλεσμα σε περίπου ν δεύτερα βήματα. Ερωτήσεις μέχρι εδώ, διότι δεν έχουμε φτάσει στο τέλος. Θα μου πείτε, εντάξει, ναι, το αντιλαμβάνομαι, το τραβάμαι λίγο. Αλλά είναι έτσι, ή όχι. Εκεί θέλω να καταλήξω, θέλω να δω τελικά εάν το σύνολο των δημάτων με αυτόν τον τρόπο είναι μικρότερο από τη γραμμική σχέση που μας δίνει η πολυπλοκότητα του δεύτερου τρόπου υπολογισμού. Όχι του πρώτου, του δεύτερου τρόπου. Είπαμε ότι το δεύτερο τρόπο είναι μικρότερο από τη γραμμική σχέση. Όχι του πρώτου, του δεύτερου τρόπου. Είπαμε ότι μέχρι στιγμής οι καλύτεροι που έχουμε δει είναι αυτοί, έτσι δεν είναι, που είναι γραμμικοί. Οπότε, λοιπόν, τι κάναμε. Βρήκαμε έναν τρόπο υπολογισμού της έκθεσης σε δύναμη που δεν θέλει νη πράξεις, αλλά θέλει περίπου νη δεύτερα πράξεις, όταν το ν είναι αρκετά μεγάλο. Αυτός, δηλαδή, ο τρόπος υπολογισμού κερδίζει έδαφος, όταν το ν είναι αρκετά μεγάλο. Όσο πιο μεγάλο είναι το ν, τόσο πιο πολύ πηγαίνει κοντά στο ν δεύτερα αριθμό πράξεων. Εάν είναι έτσι, τότε αυτό που συμβαίνει είναι το εξής. Και θα σβήσω όλα τα υπόλοιπα, κρατώντας μόνο την σχέση μας. Εφόσον, λοιπόν, έχω έναν τρόπο υπολογισμού, που για μεγάλους αριθμούς ν συγκλίνει σε ν δεύτερα πράξεις, και επειδή αυτό σημαίνει ότι τα βήματα είναι ν δεύτερα, ανεξάρτητα από το αν το ν είναι άρτιος ή περητός, έχουμε συνολικά πόσα βήματα υπολογισμού. Βήματα και εδώ το ν. Το πρώτο βήμα είναι από το ν να πάμε σε ν δεύτερα. Σωστά. Σπάμε τον αρχικό ρυθμό ν στη μέση. Άρα όσα είναι τα αρχικά ν με την πρώτη διαίδηση, ν δεύτερα, τα κάνουμε μισά τα βήματα. Με το δεύτερο βήμα κάνουμε μισά τα μισά, τα κάνουμε ν τέταρτα. Με το κ βήμα γενικά τα κάνουμε ν προς δύο εις την κ. Και αυτό θα σταματήσει όταν το ν προς δύο εις την κ γίνει περίπου ίσο με ένα. Λογαρυθμώντας αυτή τη σχέση, καταλήγω τελικά στο εξής, στο ότι θα πρέπει ν ίσο με δύο εις την κ, συνεπάγεται λογάριθμος με βάση δύο του ν είναι ίσο με κ. Άρα λοιπόν, τελικά, ξεκινώντας από μια διαφορετική διαδικασία υπολογισμού της έκθεσης, της, συγγνώμη, ύψωσης, σε δύναμη. Κατέληξα ότι για μεγάλους αριθμούς ν, το σύνολο των στοιχειωτών πράξεων είναι ανάλογο του ν δεύτερα και επειδή κάθε φορά διχοτομώ, κάθε φορά χωρίζω στη μέση, στο πρώτο βήμα απευθείας πάω στα ν δεύτερα, το αρχικό ν, το κάνω ν δεύτερα, μετά το κάνω ν τέταρτα, ν όγδωα κτλ. Καταλήγω στο ν προς 2κ και αυτό το πράγμα θα σταματήσει όταν το ν προς 2κ κινήσω με τη μονάδα. Άρα τελικά βλέπω ότι ο αριθμός των βημάτων υπολογισμού που μου χρειάζονται, εάν υποθέσω ότι η ύψωση σε δύναμη είναι στοιχειώτης πράξης, δηλαδή γίνεται μία κι έξω, είναι περίπου ο λογάριθμος με βάση 2 του ν. Αυτό σημαίνει ότι σε αυτή τη σχέση υπολογισμού έχω αυτή εδώ τη συνάρτηση πολυπλοκότητας. Προσέξτε πού είναι η 2η στη ν, καθώς αυξάνει το ν, πώς αυξάνει ο χρόνος. Η 2η στη ν είναι αυτή που αυξάνει περισσότερο από όλες τις προηγούμενες. Για αυτό και λέμε ότι οδηγεί σε πολύ δυσμενή χρόνο υπολογισμού. Άρα για τη μέση του ν σχετικά χαμηλές, 30, 40, 50, ο χρόνος γίνεται ήδη πολύ μεγάλος, ο χρόνος υπολογισμού. Αυτά είναι τα στοιχειώδη υπολογιστικά βήματα, στοιχειώδης, μάλλον, συγγνώμη, υπολογιστικές πράξεις. Όταν ο χρόνος είναι γραμμική συνάρτηση του ν, τότε καθώς αυξάνει το μέγεθος του προβλήματος, αυξάνει το ν, αυξάνει γραμμικά και ο αυθμός των στοιχειωδών πράξεων που απαιτούνται, άρα και ο χρόνος υπολογισμού, πολύ καλύτερη συμπεριφορά σε σχέση με την εκθετική. Και όταν έχω λογαρυθμική σχέση, προσέξτε ότι η αύξεση είναι πολύ πιο ήπια σε σχέση με τη γραμμική. Άρα για μεγάλα ν, καθώς λοιπόν ο αριθμός ν μεγαλώνει, άρα καθώς αυξάνει ο όρος Φιμπονάτσι που θέλω να υπολογίσω, τότε με συμφέρει να χρησιμοποιήσω αυτή την τελευταία, την τρίτη μέθοδο, η οποία χονδρικά συγκλίνει σε υπολογιστική πολυπλοκότητα μεγάλο όμικρο του λογαρύθμου του ν με βάση 2. Άρα έχω τρεις υπολογιστικές πολυπλοκότητας, τρεις κατηγορίες. Την εκθετική μεγάλο όμικρο του 2 στη ν, την γραμμική μεγάλο όμικρο του ν και την λογαρυθμική μεγάλο όμικρο του λογαρύθμου με βάση 2 του ν. Και βέβαια ξαναλέω ότι καθώς αυξάνει το ν, ο τρόπος υπολογισμού που είδαμε της έκθεσης, λέω συνεχώς έκθεσης σήμερα, της ύψωσης σε δύναμη, γίνεται πολύ πιο αποτελεσματικός υπολογιστικά, κοστίζει πολύ λιγότερο χρόνο σε σχέση με οποιοδήποτε άλλο τρόπο. Ερωτήσεις, απορίες. Το καταλάβαμε, δεν το καταλάβαμε, θέλουμε χρόνο να το καταλάβουμε. Αυτός ο σωστός συσκέπτεται για αυτοί και αυτοί όμως, δηλαδή τι είπαμε. Εδώ αυτό που αποδεικνύουμε κατά βάση είναι ότι ο αλγόριθμος της ύψωσης σε δύναμη, γιατί αυτό κάνουμε, μπορεί να βελτιστοποιηθεί έτσι ώστε από γραμμικού χρόνου να γίνει λογαριθμικού χρόνου. Διότι κανονικά η ύψωση στη δύναμη, ξαναλέω τι συνεπάγεται, τι συνεπάγεται μη πολλαπλασιασμούς. Έχεις το 2 ή στην 10, πρέπει να κάνεις 10 πολλαπλασιασμούς. Δεν μπορείς να κάνεις κάτι λιγότερο. Εάν όμως κάνεις τους υπολογισμούς με αυτόν τον τρόπο, τότε καθώς το ν αυξάνει, ο αριθμός των πράξεων που πρέπει να κάνεις συγκλίνει στον λογάριθμο με βάση 2 του ν, που βλέπουμε ότι έχει πολύ χαμηλότερο συνεπάγεται, πολύ χαμηλότερο αριθμό στοιχειωθών πράξεων σε σχέση με τον αριθμό πράξεων που συνεπάγεται η γραμμική υπολογιστική σχέση για το ίδιον ν. Γι' αυτό και λέω ότι μας συμφέρει καθώς το ν αυξάνει. Πολύ καλό το ερώτημα του συναδέλφου σας και περίμενα να τεθεί. Λέει ο συναδελφός σας ότι μια μισό λεπτό, εδώ παρουσιάζεται μπροστά μας ένας αλγόριθμος, ο οποίος δεν έχει μία στοιχειώδη πράξη, έχει ένα σύνολο από στοιχειώδεις πράξεις. Ανάθεση τιμών, έτσι, ελέγχους, έτσι δεν είναι, σωστά. Προσέξτε όμως τι γίνεται. Αυτός ο αριθμός των στοιχειωδών πράξεων είναι συγκεκριμένος και πεπερασμένος. Είναι μία ανάθεση τιμής, μία δεύτερη, κάθε φορά το α και το β δεν επαναϊπολογίζονται, μία τρίτη την power, τρεις, ένας έλεγχος while, ένας έλεγχος if, ή εδώ, πέντε και δύο αναθέσεις, έξι, εφτά, ας πούμε ότι έχω δέκα στοιχειώδεις πράξης. Άρα κάθε φάση υπολογισμού μου κοστίζει δέκα νομίσματα στοιχειωδών πράξεων, σωστά. Εάν τα βήματα υπολογισμού είναι λίγα, τα δέκα νομίσματα αναβήμα, είναι μεγάλο ποσό, έτσι δεν είναι. Δηλαδή, αν είναι λίγα τα βήματα υπολογισμού, λες, μισό λεπτό, για νύσων πέντε, για παράδειγμα, θα πληρώσω σε ισαογικά πέντε νομίσματα στοιχειωδών πράξεων, γιατί πόσες πράξεις θέλω, νύς την πέμπτη, πέντε στοιχειώδεις πράξεις. Άρα, πολύ λιγότερα από τα δέκα επί πέντε, πενήντα. Αφού δέκα νομίσματα στοιχειωδών πράξεων, πρέπει να πληρώσω για κάθε βήμα υπολογισμού εδώ. Και μάλιστα, για να είμαι ακριβής, δεν είναι δέκα επί πενήντα, είναι λογάριθμος με βάση δύο του ν, έτσι. Άρα, ας πάρω έναν αριθμό, το δύο εις την... Αν έχω δεκαέξι, ας πούμε, το ν εις την δεκάτη έκτη. Ωραία. Θέλω να υπολογίσω το χ εις την δεκάτη έκτη. Πόσες στοιχειώδεις πράξεις θέλω, με το συμβατικό σχέδιο, με το συμβατικό τρόπο, δεκαέξι κολλαπτασιασμούς. Σωστά. Συμφωνούμε. Άρα, θα πληρώσω δεκαέξι χρυσά νομίσματα στοιχειωδών πράξεων. Ας το πούμε έτσι. Εάν το κάνω με τον άλλο τρόπο, είναι λογάριθμος με βάση δύο του ν, το οποίο είναι δύο εις την το δεκάτη τετάρτη. Άρα, τέσσερα. Επιδέκα, βέβαια, έχω βρει ότι θέλω δέκα πράξεις, δέκα κινήσεις σε κάθε πράξη. Επιδέκα, σαράντα. Δεν με συμφέρει. Σαράντα εδώ, δεκαέξι εδώ. Αν όμως δεν είναι δύο εις την τετάρτη, αλλά είναι δύο εις την εξιντατέσσερα, που είναι ένας κολοσιαίος αριθμός, είναι κάτι τρεις εκατομμύρια τρεις εκατομμυρίων, ο αριθμός των στοιχειοδών πράξεων πόσους γίνεται εδώ, λογάριθμος με βάση δύο του δύου στην εξιντατέσσερα, δηλαδή εξιντατέσσερα, επί δέκα, εξακώς για σαράντα. Με συμφέρει. Θα πληρώσω λιγότερα. Άρα, καθώς μεγαλώνει, λέμε, το μέγεθος του προβλήματος, καθώς αυξάνει ο αριθμός ν, αυξάνει και η διαφορά μεταξύ του λογαριθμικού χρόνου και του γραμμικού χρόνου. Στο συγκεκριμένο πρόβλημα της ύψωσης σε δύναμη, δεν είναι τα πράγματα ακριβώς όπως φαίνονται στην καμπύλη, δηλαδή να την κάνω την καμπύλη αυτή στην άλλη πλευρά του πίνακα. Στο συγκεκριμένο πρόβλημα, αν ο γραμμικός χρόνος είναι, ας πούμε, αυτός, ο λογαριθμικός χρόνος είναι έτσι. Στην αρχή είναι μεγαλύτερος. Κάπου ένα σημείο και μετά, που μπορώ να το βρω, γίνεται μικρότερος. Θα αναφερθώ στα αποτελέσματα που συλλέξαμε από την εκπόνηση της επαναληπτικής ασκήσεις ή μάλλον του επαναληπτικού σέτα ασκήσεων. Πιστεύω ότι ενδιαφέρει όλες και όλους, διότι η λογική της εκπόνησης αυτού του σέτα ασκήσεων είχε να κάνει με το να εντοπίσουμε κοινά μοτίβα προβλημάτων, έλλειψης γνώσης, έλλειψης δικόσμου αντισδιεκτρινήσεων, ώστε από κοινού να προσπαθήσουμε να καλύψουμε προβλήματα και κενά. Πριν το κάνω αυτό, με αφορμή ένα ερώτημα και ευχαριστώ για αυτό που τέθηκε από στους αδερφούς σας στο διάλειμμα. Αυτό που έλεγα πιο πριν στο παράδειγμα του υπολογισμού ήταν ότι το 2 στην 64 δεν είναι αυτό που θέλω να υπολογίσω, έστω ότι θέλω να υπολογίσω μία δύναμη που είναι ίση με το 2 στην 64, ότι το ν είναι ίσο με 2 στην 64. Τότε, λοιπόν, ο λογάριθμος συμφέρει πάρα πολύ. Το 2 στην 64 θέλει 64 πράξεις απλά και είναι ακόμη μικρότερος αριθμός από αυτόν που παράγουμε με τον τρόπο που είδαμε. Αυτή η μικρή διευκρίνηση. Και πάμε λίγο τώρα να δούμε την επανάληψη του πρώτου κύκλου. Για να θυμηθούμε. Και έχω και σχόλια επίσης. Έχω εκτυπώσει μόνο κάποια από αυτά. Έχω σχόλια από την εκπώνηση του πρώτου θέματος. Τι είδα και τι είδαμε συνολικά από την εκπώνηση του πρώτου θέματος. Πάμε πρώτα στις ασκήσεις. Στόχο είχαν την αυτόν την εξάσκηση και τον εντοπισμό αδυναμιών και τα λοιπά. Είταν επίσης η πρώτη φορά που με έναν αυτόνομο τρόπο επιλύσατε ασκήσεις. Το ξανακάνουμε αυτό στο πέρας του εξαμήνου, όταν στο τελευταίο εργαστήριο θα σας αφήσουμε να λύσετε ασκήσεις προηγούμενης χρονιάς που θέθηκαν ως θέματα σε εξετάσεις. Λοιπόν, θα κάνουμε και μια προσομοίωση αυτού του είδους. Πάμε στην πρώτη ασκήση. Η πρώτη ασκήση ζητούσε το να αναπτύξουμε μία συνάρτηση που θα χρησιμοποιεί τον λεγόμενο νόμο των συνειμητών για να υπολογίζει την τρίτη πλευρά ενός τριγόνου. Τι είδαμε εκεί και τι είδα, αν θέλετε, εκεί. Εντάξει, ας είμαι ρεαλιστής. Τι είδα εκεί. Σε κάποιες περιπτώσεις, και θα σας πω σε πόσες περιπτώσεις, έτσι, άρα, εγώ συνολικά συνέλεξα 160 περίπου απαντήσεις. Τώρα δεν ξέρω αν τόσοι ήταν αυτοί που έλαβαν μέρος στο εργαστήριο εκείνη την εβδομάδα ή απλά οι υπόλοιποι. Είναι και οι υπολογιστές. Ναι. Ξέρω ότι υπάρχει, τέλος πάντων, μία φορά. 160 περίπου απαντήσεις, χονδρικά. Κάποιοι, λίγοι, τάξη μεγέθους 10, δεν παρέδωσαν συνάρτηση. Δηλαδή αυτό που παρέδωσαν ήταν μια προσπάθεια κατασκευής προγράμματος που δεν ήταν συνάρτηση. Θα σας πω, λοιπόν, πρώτα, κάποια ευρήματα και μετά το πώς θα με θερμηνεύουμε τα ευρήματα αυτά. Σε κάποιες λιγότερες από 10 περιπτώσεις, βάζατε... Αυτός, αυτοί που το έκανε, έβαζε τη συνάρτηση να ζητά input. Επίσης, σε κάποιες περιπτώσεις, η συνάρτηση, πολύ λίγες, μία, δύο, τρεις, ίσως, περιελάμβανε τις τιμές εισόδου. Σας λέγαμε, βρείτε για τα τάδε στοιχεία και εσείς τις ενσωματώσατε σαν τιμές της συνάρτηση. Αυτή είναι η έννοια του hard coding. Πηγαίνω και σφινώνω τις τιμές στον κώδικα, έτσι. Σε κάποιες περιπτώσεις, το όνομα του αρχείου δεν ήταν ίδιο με το όνομα της συνάρτησης. Προφανώς και τρέχει και σε μάτλο και σε οκτέιβ, αλλά δεν είναι σωστή πρακτική. Η συνάρτηση σε κάποιες άλλες δεν είχε μεταβλητή εξόδου. Δηλαδή γινόταν κανονικά ο υπολογισμός, δεν υπήρχε ανάθεση του αποτελέσματος σε μία μεταβλητή για να πάει πίσω, να επιστρέψει στο κυρίως πρόγραμμα. Σε μία ή δύο περιπτώσεις, είδα ότι η ανάθεση τιμής γίνεται στο όνομα της συνάρτησης. Αυτό είχε ισχυαίτερο ενδιαφέρον γιατί δεν το συναντά συχνά και παραδόξως δουλεύει. Αυτός ή αυτοί που το έκανε θα το έτρεξε και θα είδε ότι δουλεύει. Δηλαδή έχω μια συνάρτηση που την ονομάζω Μίτσος και στο τέλος έχω ένα Μίτσος ίσον Τόσο και δουλεύει. Επίσης, δεν χρησιμοποιείται το end. Άρα, λοιπόν, αυτή η εικόνα συνολικά είναι μια εικόνα που δείχνει πως σε γενικές γραμμές γνωρίζουμε να χρησιμοποιούμε συναρτήσεις, γνωρίζουμε τον σωστό τρόπο χρήσης των συναρτήσεων, αλλά έχουμε κάποια θέματα. Κάποιοι και κάποιες έχουν θέματα. Και αυτό είναι αναμενόμενο. Λογικό δεν είναι. Δεν είμαστε ίδιοι άνθρωποι, δεν είμαστε κλόνοι ενός ή δύο ή τριών ανθρώπων. Αυτό που θέλουμε, λοιπόν, είναι να εντοπίσουμε τα προβλήματα, αυτό κάνουμε εδώ, και να τα επιλύσουμε. Θα σας πω, λοιπόν, ένα-δυο πράγματα για συναρτήσεις εντάχει, μέσα σε δύο λεπτά, αλλά το πιο σημαντικό είναι ότι εξής. Εσείς οι οποίοι κάνατε αυτού του είδους τα λάθη, τα γνωρίζετε. Και, μάλιστα, θα βγάλω και κάποιες ενδεικτικές, αν θέλετε, λύσεις αν αυτό βοηθά, που θα έχουν δοθεί από συναδέλφους και συναδέλφοι σ' εσάς. Δεν θα είναι δικές μας λύσεις, απλά μια επιλογή λύσεων. Ελάτε να με βρείτε και να μας βρείτε. Μην αφήνετε αυτή την έλλειψη εμπειρίας ή και γνώσης ή και κατανόησης ή και πρακτικής άσκησης να σας ακολουθεί μέχρι το τέλος, διότι δεν θα το καλύψετε το κενό. Ελάτε λοιπόν να με βρείτε τη Δευτέρα που έχουμε ώρες συνεργασίας. Ελάτε Τρίτη, Τετάρτη στα παιδιά που υποστηρίζουν το μάθημα επίσης στις ώρες συνεργασίας. Και, πολύ σημαντικό, σας λέμε στην εκφώνηση αυτής της άσκησης ότι αν αντιμετωπίσετε πρόβλημα στην πρώτη άσκηση, κάντε τη στάδε ασκήσεις. Σας προτείνουμε ένα σετασκήσιο. Κάντε το. Και αν δεν ξέρετε αν είναι σωστές, ελάτε με ό,τι έχετε κάνει να το δούμε μαζί. Θα καθίσουμε και να το δούμε. Πρέπει λοιπόν να τα δουλέψουμε αυτά. Ώστε, για παράδειγμα, να μην χρησιμοποιούμε ποτέ input σε συνάρτηση. Τρέχει. Δεν παράγει λάθος. Είναι λάθος σε επίπεδο σύλληψης. Τη συνάρτηση τη θέλουμε ως μαύρο κουτί. Έλα, μαύρο κουτί, πάρε αυτή την είσοδο, κάνε ότι κάνεις και δώσε μου πίσω μία ή δύο ή τέσσερις ή πέντε εξόδους, αλλά προς θεού ή μη θεού, ανάλαβα με το τι είναι ο καθένας, μην μου ζητάς ενώ τρέχεις μία είσοδο. Ξαφνικά είναι σαν να πλώνει το χέρι το μαύρο κουτί και να μου λέει δώσε. Τι? Ό,τι ήταν να σου δώσω, θα έδωσα σαν ορίσματα εισόδου. Αυτό θα έπρεπε να συμβαίνει. Διαφορετικά, γιατί το κάνουμε αυτό. Παρεμβάλλεται ως χρήστης στην εκτέλεση της συνάρτησης. Άρα, αν κάνει οτιδήποτε ο χρήστης, σπάει η ροή του προγράμματος. Μπορεί να διακοπεί συνάρτηση, να δώσει σκουπίδια, να δώσει οτιδήποτε. Δεν πρέπει να το κάνουμε ποτέ αυτό. Επίσης, προφανώς δεν περιλαμβάνουμε τις τιμές εισόδου, αυτό είναι θέμα απειρίας. Ναι, το όνομα του αρχείου πρέπει να είναι το όνομα της συνάρτησης. Είναι μια καλή πρακτική αυτή, γιατί μας γλιτώνει από προβλήματα, όταν μετά θα ξεχνάμε πώς βαφτίσαμε τη συνάρτηση και την μεταβλητή μέσα στη συνάρτηση. Το να μην έχει μεταβλητή εξόδου, πιστεύω ότι είναι επίσης θέμα απειρίας, δηλαδή αν τη χρησιμοποιούσατε θα το βλέπατε. Ίσως την τρέξατε μια φορά ή μπορεί και να μην την έτρεξε αυτός για αυτή που το παρέδωσε. Να το πέρασε απλά σαν απάντηση. Αυτοί οι οποίοι δεν παρέδωσαν συνάρτηση, είτε δεν κατάλαβαν πράγμα που το θεωρώ απίθανο, αλλά όχι, αλλά δεν μπορώ να το αποκλείσω, ή έχουν πρόβλημα στο να δημιουργήσουν μια συνάρτηση, μπορεί να συμβεί. Δεν πρέπει να αισθάνεστε άσχημα ως προς το ότι δεν μπορείτε να δημιουργήσετε συνάρτηση. Πρέπει να αισθάνεστε άσχημα αν δεν κάνετε κάτι με αυτό ή για αυτό. Απλά πράγματα. Η ανάθεση τιμής το να γίνει στο όνομα της συνάρτησης, πολύ παράξενη κατάσταση. Το να μην χρησιμοποιείτε το end, είπαμε, τρέχει, αλλά δεν είναι σωστό. Προφανώς, λοιπόν, ξέρετε οι περισσότεροι... Ναι. Δεν έχουμε τρόπο να βρούμε το τι έχετε απαντήσει. Δηλαδή αυτή τη στιγμή υπάρχει ένας πίνακας, σκεφτείτε, όπου οι γραμμές είναι ο κάθε ένας από εσάς και οι στήλες είναι αυτά που απαντούσατε. Και ο πίνακας είναι ανώνυμος. Το μόνο που φαίνεται είναι από ποιο εργαστήριο προέρχεστε. Δηλαδή είναι το τρίτης, δυόμισι, τέσσερις αυτό. Γι' αυτό και αναφέρομαι σ' αυτούς που τυχόν θυμούνται αναλυτικά ή έχουν στο μυαλό τους ότι εκείνη η απάντησή μου μπορεί να μην πήγε πολύ καλά. Εάν έχετε αμφιβολίες, ελάτε σε κάθε περίπτωση. Ελάτε σε κάθε περίπτωση, ώστε να δουλέψουμε από κοινού τις απαντήσεις που θα δώσετε στις ερωτήσεις και στις ασκήσεις που προτείνουμε προς εκπόνηση. Κάντε λοιπόν αυτή τη δουλειά, εκπονίστε κάποιες από τις ασκήσεις, εξάσκησης και ελάτε να τις δούμε μαζί. Ερώτημα. Ναι, γιατί τρέχει, λέει συνάδελφός σας ότι δεν δίνεται το end. Ναι, διότι τρέχει σε κάθε περίπτωση. Εμείς, όμως, σας λέμε να το βάζετε πάντα. Στα παραδείγματα θα τηρείτε αυτό που λέει εκπόνηση και αυτό το κάναμε, γιατί πολλές φορές αυτό το end, ακριβώς επειδή, λέει συνάδελφός σας, γιατί στην εκφώνηση που μας δίνεται και στις έτοιμες καινές συναρτήσεις δεν υπάρχει end. Διότι μπορεί μέσα στη συνάρτηση να χρησιμοποιήσετε δομή η οποία να θέλει end. Έτσι δεν είναι. Εάν εσείς έχετε ξεχάσει να βάλετε το end ή δεν ξέρετε ότι πρέπει να μπει το end και υπάρχει στη συναρτήση, επειδή η συνάρτηση τρέχει και χωρίς το end, θα πάρει ως end αυτό τη συνάρτηση και δεν θα έχετε καταλάβει το λάθος που κάνετε. Μας μας ενδιαφέρεται να καταλάβετε ότι είναι λάθος, έτσι. Είναι προερετικό πάντα το να το βάζουμε, έτσι. Οπότε, η βασική λογική είναι, επίσης είδα να κάνω δυο προβλήματα με αγγείλες κτλ. Βάζω αγγείλες εδώ στην έξοδο, όταν έχω περισσότερες από μία εξόδους. Θέλετε να βρείτε έναν τυφλοσούρτι, βάλετε αγγείλες πάντα, τετραγωνικές αγγείλες. Και σε μία έξοδο λειτουργεί. Δεν υπάρχει πρόβλημα. Και από έγιω και πέρα, θα πρέπει να αρχικοποιήσω τις εξόδους απλά για λόγους ασφαλείας. Δώσε μια αρχική τιμή στις εξόδους. Εδώ έχω δύο εξόδους, OUT1, OUT2 και ίσως και άλλες. Δώσε μια αρχική τιμή 0, 1, κάτι, και μετά κάνω πράξεις, οι οποίες στο τέλος θα καταλήξουν στο να αποδοθεί τιμή στην OUT1, στην OUT2 και στις περισσότερες, αν έχω. Αγγείλες μπορείτε να μη βάλετε, αν έχετε μόνο μία έξοδο. Επίσης, μπορείτε να έχετε συντάρτηση χωρίς όρισμα εισόδου και εξόδου. Να θυμίσετε ότι ισχύουν αυτά. Πρέπει να τα ξαναδούμε. Ότι αυτό το function από το δοκιμή, έχει μόνο ένα πράγμα, ISON5. Θα τρέξει, θα αποδώσει αυτό. Δεν θα μεταφέρει τιμή, όμως, στο κυρίως πρόγραμμα. Άρα, το μήλυμα στη βάση των παρατηρήσεων που έχουμε από την πρώτη άσκηση είναι εξάσκηση στις συναρτήσεις, εκεί όπου αισθάνεστε αδυναμία και κενά, ελάτε, όπως δίποτε, να μας βρείτε και να μας βρείτε. Μην τα αφήνετε αυτά, γιατί ακόμη και στα εργαστήρια, που είσαστε λιγότεροι και δεν είσαστε όσοι είσαστε εδώ, είσαστε 20 άτομα, οπότε δεν υπάρχει πολλής χρόνος να ρωτάτε πράγματα, ενταχωμένως, να πειραματιστείτε, έτσι. Τώρα, δεύτερη άσκηση. Στη δεύτερη άσκηση, σας ζητούσαμε τον υπολογισμό Φιμπονάτση. Οι περισσότερες λύσεις ήταν συμβατικές. Δηλαδή, εννοώ αναμενόμενες, όχι κακές. Αρκετές λύσεις με συναρτήσεις. Δεν ζητεί το συναρτήσει, εδώ, να θυμίσω. Έπρεπε να αναπτύξετε ένα προγραμματάκι, που θα υπολογίζει η Φιμπονάτση. Όπου και εκεί είδαμε το να διαβάζετε το νεοσύν που τελειώσει τη συναρτήση, είναι hard-coded. Δηλαδή, η τιμή 30 που ζητούσαμε, να είναι μέσα στην συναρτήση, έτσι. Κοιτάξτε αυτό εδώ. Αυτή είναι μια απάντηση που δόθηκε από κάποιον πέρυσι. Πέρυσι, όπου είχα βάλει πάλι αυτή την άσκηση. Τρέχει αυτή η συναρτήση. Προσέξτε λίγο. Έχει. Έξοδο χ. Όνομα συναρτήσης code, είσοδος 1, μάλιστα. Χ του 1, 0. Χ του 2, 1. Επιτρέπεται, βεβαίως. Μπορεί να έχεις μία έξοδο και η έξοδος θα είναι έναν ολόκληρο διάνυσμα. Άρα μιλάς τώρα για στοιχεία του διανύματος. Το χ1, το χ2, το χ3 του, χ. Πολύ ωραία. Πολύ ωραία. Για i από 3 έως ν, α του i σαν α του i πλήν 1 σαν α του i πλήν 2. Τέλος, χ σαν α του ν. Τρέχει. Για δείτε το. Γιατί. Βλέπετε το καλύτερα. Εγώ σας λέω ότι δεν τρέχει και ότι είναι τόσο προφανές το λάθος που δεν το βλέπουμε. Το χ1 και χ2 είναι πιο ευκολά όσο είναι αγκαστικά είναι ορθανή. Δεν ξέρετε να βάλει σήμερα σημείο το χ1, να βάλει τώρα πάντως το χ2, να βάλει τώρα πάντως το χ3, να βάλει τώρα πάντως το χ4, να βάλει τώρα πάντως το χ5, να βάλει τώρα πάντως το χ6. Δεν ξέρετε να βάλει σήμερα σημείο το χ1, να βάλει τώρα πάντως το χ2, να βάλει τώρα πάντως το χ3, να βάλει τώρα πάντως το χ4, να βάλει τώρα πάντως το χ5, να βάλει τώρα πάντως το χ6. Μα, ναι. Δεν χρησιμοποιείς το α, λεχεί το 1 και το 2, αλλά α το πάει, α το πάει και το χ. Αυτό. Εκεί είναι το θέμα. Δηλαδή όταν θα φτάσει να υπολογείς... Πού είναι το α1, πού είναι το α1, είναι τόσο πρόδυλο που μας ξεφεύγει. Έτσι. Θέλει να δώσει τιμές στο χ και μιλάει για α. Θέλει να υπολογείς η μήλα και μιλάει για πορτοκάλια. Σύνηθες λάθος. Άρα, εδώ έπρεπε να έχει τα χ, έτσι, για να μπορέσει στο τέλος να έχει ένα χ του ν, ως απάντηση. Τώρα, τρίτη άσκηση. Στην τρίτη άσκηση, ο αλγόριθμος είναι απλός. Είναι η λεγόμενη οικασία του collage, για κάθε ακέραιο ν, αν είναι άρτειος το ν τότε, στην επόμενη επανάληψη το αν αντικαθιστούμε με το ν δεύτερα, αν δεν είναι άρτειος το αν αντικαθιστούμε με τρία ν συν ένα. Έχει ένα ενδιαφέρον, διότι πάρα πολλοί έχουν ασχοληθεί με το να αποδείξουν την οικασία αυτή. Προσέξτε, δεν έχει αποδειχθεί ακόμη ότι συγκλίνει στο ένα, φοβερό, δεν είναι. Όσες δοκιμές έχουν γίνει όλα αυτά τα χρόνια από πάρα πολλούς, έχουν οδηγήσει ότι συγκλίνει στο ένα, αλλά δεν έχει αποδειχθεί, γι' αυτό και ονομάζεται η οικασία. Και έχει και ενδιαφέρουσες, έτσι, ιδιότητες αυτή η οικασία. Μια λύση, ας πούμε, που δόθηκε ήταν αυτού του είδους. Αυτή δεν δόθηκε από εσάς, είναι μια από τις λύσεις που δώσαμε εμείς. Το ΡΕΜ είναι το υπόλοιπο διέρεσις. Τρέχει κανονικά και ουσιαστικά εδώ με account είναι αυτή που υπολογίζει πόσες φορές θα τρέξει έως ότου κατελήξει στη μονάδα. Θυμάστε, το ερώτημα ήταν για νύσων 6, δεν θυμάμαι πόσο ήταν, πόσες φορές... Είναι σαν το μόντεδο, είναι το υπόλοιπο της διέρεσις. Και μάλιστα, κοιτάξτε μια ενδιαφέρουσα ιδιότητα που έχει η οικασία αυτή. Εδώ έχουμε το ν, και εδώ έχουμε το πόσα βήματα χρειάζεται το κάθε ν για να καταλήξει στη μονάδα. Υπάρχει ένα μοτίβο, έτσι δεν είναι. Δηλαδή βλέπετε ότι για παράδειγμα για ν 7.000 μπορεί να χρειαστούν από 50, 200, ανάλογα με το πού ακριβώς είναι. Έχει ενδιαφέρον, θα βρείτε πολλά και στο διαδίκτυο για αυτή την οικασία. Προβλήματα εδώ που είδαμε είχαν να κάνουν με την ανάλογα, και με μίσοστοι, πολύ λίγοι, έκαναν μίσοστη χρήση της δομής. Οι περισσότεροι είδαν ότι χρειάζεται σε μια while, υπήρχαν και άλλοι τρόποι. Και κάποια προβλήματα στις δομές. Άρα υπάρχει θέμα με τις δομές και πρέπει να το φροντίσουμε. Με ασκήσεις περισσότερες και με περισσότερη δουλειά και διευκρινήσεις. Στην τέταρτη άσκηση έφτασαν λίγοι, λίγα εργαστήρια, μάλλον σε λίγα εργαστήρια. Αναμενόμενο αυτό, διότι έχετε λίγο χρόνο στα εργαστήρια, οπότε πολλοί από εσάς δεν είχατε την δυνατότητα να αναμετρηθείτε με την άσκηση, η οποία σε επίπεδο λύσης είναι πολύ απλή αν την κάνει κανείς διανυσματικά. Παρ' όλα αυτά, ποιο ήταν το ζητούμενο? Είχατε έναν πίνακα 648x509 με τιμές από 1 έως 128. Αυτός ο πίνακας από την εικόνα. Ζητούσαμε την μέση τιμή στον κυλοποιημένη στον εγκύτουρο ακέραιο. Μπορούσατε να χρησιμοποιήσετε την ράουν. Και μετά δύο αντικαταστάσεις. Όσες τιμές του πίνακα είναι μεγαλύτερες από τη μέση τιμή να αντικατασταθούν με τη μέγιστη και όσες είναι κάτω από τη μέση τιμή να αντικατασταθούν με την ελάχιστη. Εδώ υπήρξαν λοιπόν πολλοί και πολλές που δεν πρόλαβαν. Από τις απαντήσεις που δόθηκαν, το σάρκι, από τις απαντήσεις που δόθηκαν, το 40% περίπου ήταν μη διανισματικές. Άρα ήταν η μακριά οδός, μέσω λαμίας, όπως λέμε. Και αυτό δεν σημαίνει ότι ήταν λάθος, αλλά αυτό μου δίνει τη δυνατότητα να σας πω να ασκηθείτε με τις προτενόμενες δραστηριότητες διανισματικού προγραμματισμού. Ξέρω ότι ο διανισματικός τρόπος σκέψης είναι δύσκολος από όλη εξάσκηση και τριβή. Ο μόνος τρόπος για να το αντιμετωπίσει κανείς αυτό είναι μέσω της εξάσκησης και της τριβής. Δεν υπάρχει άλλος τρόπος. Τώρα, το 5%-10% από τις απαντήσεις είχαν βαριά προβλήματα. Υπήρχαν λάθη συντακτικά, υπήρχαν λάθη λογικά, δηλαδή υπήρχαν ενδιάμεσες μεταβλητές, τις οποίες δίνατε τιμές για να τις χρησιμοποιήσετε βοηθητικά, οι οποίες όμως οδηγούσαν σε λάθος αποτέλεσμα. Εάν αισθάνεστε ότι έχετε τέτοιου είδους θέματα, πάλι ελάτε να μιλήσετε μαζί μας, δείτε όλες τις ασκήσεις από την αρχή, δοκιμάστε να ξαναλύσετε αυτή την άσκηση, όπως και τις προηγούμενες ασκήσεις και ελάτε να τις δούμε αναλυτικά και με τρόπο τέτοιο, ώστε να μην αφήσουμε τίποτα αντιευκρίνιστο. Η λύση ήταν πολύ απλή και θα τη σχολιάσω εδώ τη διανισματική λύση. Προσέξτε. Ο πίνακας μας ήταν ο χ, σωστά. Ο συμβολισμός χ'άνω κάτω τελεία σημαίνει κάθε στοιχείο του χ. Και ταυτόχρονα δίνει τη δυνατότητα στην μην, επειδή η μην αν τρέξει επί του χ τι παράγει, να θυμίσω το εξής. Αν έχω έναν πίνακα πέντε επί πέντε, είναι πέντε γραμμές επί πέντε στήλες, τότε η μην δεν θα παράξει μία τιμή, θα παράξει πέντε τιμές. Ανά στήλει, θα βρει την μέση τιμή αναστήλει. Δηλαδή αν έχω τον πίνακα 1, 2, 3, 4, 5, 6, 7, 8, 9, έστω ο πίνακας α, η μην του α θα παράξει ένα διάνυσμα, τη μέση τιμή ανά στήλει, σιγουρεί. 1 και 4, 5 και 7 είναι το 12 τρίτα, το 15 τρίτα και το 18 τρίτα. Για να μπορέσουμε να υπολογίσουμε την μέση τιμή μία και έξω, είτε θα πρέπει μετά να υπολογίσουμε τη μέση τιμή της μέσης τιμής, για αυτό πολλές φορές με έχετε δει να χρησιμοποιώ το μην του μην, οπότε σημαίνει σαν να λέω η μέση τιμή αυτού, που θα οδηγήσει τελικά στη μέση τιμή του αρχικού, ή διαφορετικά να πω κάνω τον υπολογισμό για κάθε στοιχείο αναγραμμή στήλει, αναγκάζει λοιπόν τον υπολογισμό να τρέξει ένα γραμμή και στήλει, και έτσι απευθείας παράγει το αποτέλεσμα. Μην του α θα παράξει την τελική μία μέση τιμή. Νάτη, και επειδή αυτή θα είναι ένας δεκαδικός αριθμός, τον στρογγυλοποιώ με τη ραούντ και αυτή η τιμή είναι ο μέσος όρος MO εδώ, σωστά. Από εκεί και πέρα, εάν θέλω να πω, εάν θέλω αλγοριθμικά να βρω τις τιμές του X, που είναι μεγαλύτερες από το μέσο όρο και να τις αντικαταστήσω με τη μέγιστη τιμή του X, αυτό μπορώ να το χτίσω. Πρώτα απ' όλα, ποια είναι η μέγιστη τιμή του X? Η μέγιστη τιμή του X είναι η max του X για κάθε στοιχείο γραμμής στήλεις, με την ίδια λογική με το μ. Ωραία. Άρα θέλω να αναθέσω αυτή την τιμή, θέλω να την αναθέσω στα στοιχεία του X, που πληρούν μια συνθήκη. Ποια συνθήκη είναι μεγαλύτερα από το μέσο όρο? Είναι το X μεγαλύτερο από το MO. Τι θα μου παράξει αυτή η σύγκριση? Ένα νέο, όχι, μηδέν και ένα. Και αυτά όλα τα χρησιμοποιώ ως τι? Ως δείκτες για το X. Θέλω λοιπόν τα στοιχεία του X, για τα οποία, όχι, ισχύει πως X μεγαλύτερο από το μέσο όρο, να είναι ίσα με το max. Μία γραμμή. Θα το δοκιμάσεις, δεν θα σου πω, θα το δοκιμάσεις. Και όμια βέβαια, θα λειτουργήσουμε με το μικρότερο. Η find, απλά να θυμίσεις ότι δεν οδηγεί σε έναν πίνακα με τον ίδιο τρόπο. Αυτή είναι η διαφορά. Οπότε, ξαναλέω. Με μία γραμμή έχουμε λύσει ένα ζήτημα που, κατά τα άλλα, χρειάζεται μία ολόκληρη δομή. Και μάλιστα όχι μία. Δηλαδή μία περσινή πάλι λύση, ήταν αυτή εδώ. Αναλυτική λύση, που σε κάποιος από εσάς θυμίζει λύσεις που δόθηκαν. Βλέπετε τι γίνεται. Ουσιαστικά για i από 1 έως 648 και j, 1 έως 509 με βήμα 1, το s είναι s συνχή του i. Άρα δημιουργείται μία μεταβλητή, στην οποία αθρίζονται όλα τα στοιχεία x, y, j, να το έχουν να βρεθεί το άθρισμα όλων των στοιχείων του πίνακα και να διαιρεθεί μετά με οτιδήποτε. Εάν το χειτουργεί το i μεγαλύτερο του max, το οποίο αρχικά ορίστηκε ως ένα ένα, δηλαδή κάνει και έβρεση του μεγείς του και έβρεση του ελαχής του. Τα κάνει όλα. Είναι μία πολύπλοκη διαδικασία υπολογισμού. Προφανώς και μπορεί να τρέξει, γιατί σας το δείχνω. Όχι για να σας, για να γίνω επικριτικός. Και φαντάζομαι ότι αντιλαμβάνεστε ότι δεν υπάρχει στοιχείο επίκρισης εδώ. Εντοπίζουμε διαφορετικές μορφές λύσεις. Και σχολιάζουμε τις μορφές λύσεις. Διότι μία τέτοια λύση προφανώς σας παίρνει τουλάχιστον, ακόμη και στον πιο ασκημένο, παίρνει ένα τέταρτο για να γραφεί και να δοκιμαστεί. Άρα θα σας πάρει περισσότερο. Ενώ μία τέτοια λύση, προφανώς εάν κανείς έχει τη γνώση, είναι δύο λεπτά. Αυτό λοιπόν ο πίνακας λέει, εδώ συνάδελφό σας, ότι ό,τι υπάρχει εδώ μέσα, και είναι ένα από τα προβλήματα που έχω εντοπίσει ότι έχουμε ακόμη, δηλαδή δεν έχουμε κατακτήσει αυτό το στοιχείο. Προσέξτε, έστω ότι έχουμε τον πίνακα α, ίσο με αυτά που βλέπετε εκεί. Τον πίνακα δ, και του λέμε α μεγαλύτερο του 8. Τι θα συμβεί? Είναι το 1 μεγαλύτερο από το 8. Όχι. Είναι το 2. Όχι, όχι, όχι, όχι, όχι, όχι, όχι, ναι. Συμφωνούμε? Αυτό είναι το αποτέλεσμα αυτής της σύγκρισης. Το βλέπετε? Άρα, όταν βλέπετε αυτή εδώ την σύγκριση εδώ μέσα, ξεχάστε την τώρα και βάλτε έναν τέτοιο πίνακα. Αν του πω τώρα, δώσε μου το α του τάδε, μπορώ? Αυτό είναι κάτι που επίσης δεν έχουμε κατακτήσει. Βεβαίως και μπορώ, δηλαδή μπορώ να χρησιμοποιήσω έναν πίνακα, για να δείξω στοιχεία ενός άλλου πίνακα. Αν υπάρχει ένα προς ένα σχέση, υπάρχει ένα προς ένα σχέση, ένα προς ένα. Άρα, είναι σαν να του λέω, σβήσε, σβήσε, σβήσε, σβήσε, σβήσε, σβήσε, σβήσε, δώσε. Ποιο θα δώσει το εννιά. Οπότε, αν του πω αυτό κάν το max του α, και μάλιστα είπαμε, θα βάλει στη θέση, όπου ήταν το εννιά, την τιμή που βρήκε ως μέγιστο. Αυτή είναι η κατάσταση κλειδί και πρέπει να επιμείνουμε σε αυτό. Ξανά λοιπόν, θα το ξαναπώ, γιατί ξέρω ότι όντως υπάρχει θέμα εδώ. Έχω έναν αρχικό πίνακα. Μπορώ να δείξω σε περιοχές του, με τη βοήθεια ενός άλλου πίνακα, έστω λοιπόν ότι εγώ κάνω τη σύγκριση α, ο πίνακάς μου, μεγαλύτερος από 8. Μπορώ, βεβαίως. Τι θα προκύψω σ' αποτέλεσμα ένας άλλος πίνακας. Νάτος. Μπορώ να του αποδώσω και όνομα. Δηλαδή να του πω ότι β ίσο με το α μεγαλύτερο του 8. Οπότε θα δημιουργήσει έναν πίνακα β, δεν θα δημιουργήσει, δηλαδή θα υπολογίσει το αποτέλεσμα αυτής της πράξης και θα το αποδώσει στον πίνακα 8. Β. Β, σωστά. Στον πίνακα β. Άρα ο β πλέον θα είναι ο πίνακας που λέγαμε πιο πριν, ο μηδενικά μηδενικά 1. Οπότε τώρα μπορώ να του πω δώσε μου τα στοιχεία του α του β αναρωτιέστε και πάλι τι λέει, τι είναι τούτο, τι είναι αυτό. Χρησιμοποιώ τον β για να δείξω περιεχόμενο στον α. Για να το κάνω αυτό θα πρέπει ο β να έχει σε επίπεδο στοιχείων μια σχέση ένα προς ένα. Έχει τον ίδιο αριθμό γραμμών και στυλών. Απλά πράγματα. Δεν έχει. Τρία επί τρία είναι ρε παιδιά, έλαιος. Άρα πώς το ερμηνεύει τώρα το MATLAB. Λέει ότι 0,1 είναι λογικά 0,1 θυμάστε. Είναι σύγκριση αυτό που έγινε. Άρα το μηδέν και το ένα σημαίνει ναι όχι. True, false. Έτσι δεν είναι. Άρα είναι σαν διακόπτες. Ανοιχτό, κλειστό. Κλειστό, κλειστό, κλειστό. Κλειστό, κλειστό, κλειστό. Κλειστό, κλειστό, ανοιχτό. Το μόνο ανοιχτό είναι στα δύο δωτηγονία. Ποιο είναι το εννιά. Άρα είναι σαν ουσιαστικά να χρησιμοποιώ αυτόν τον πίνακα για να χαρτογραφίσω τον αρχικό. Οπότε μετά όταν του πω ότι το α του β, κάντο μου 58, 66, 82, 3835, δεν έχει κανένα πρόβλημα. Θα γίνει ανέτος. Το α του β θα εμφανίσει το στοιχείο το 9. Άρα λοιπόν με αυτόν τον τρόπο μπορώ να χειριστώ και τέτοιου είδους συγκρίσεις. Ξέρω ότι είναι δύσκολο και ότι ξαναλέω δεν το έχουμε κατακτήσει. Θα επιμείνουμε και θα ξαναεπιμείνουμε. Για όσες και όσους από εσάς αισθάνεστε παράξενα, επίσης έχω την εντύπωση ότι μπορώ να με θερμηνεύσω λίγο το συνέστημα. Λίγο κρατιέμαι και λέω εντάξει τώρα δεν το καταλαβαίνω αλλά να μην το πω. Το έχουμε πει αρκετές φορές. Λίγο εντάξει αλλά να μην πάω να ρωτήσω γιατί θα μου πουν πάλι ναι και τα λοιπά. Δεν θα σας πει κανένας τίποτα. Όλοι έτσι έχουν ξεκινήσει. Δεν υπάρχει άνθρωπος που να ξεκίνησε αλλιώς. Αυτοί που βλέπετε δίπλα σας οι οποίοι αντιλαμβάνονται, δεν έχεις ασθέσει κάποτε. Δεν ήταν κάτι άλλο. Αυτό είναι το μόνο βέβαιο. Σας το υπογράφω. Άρα ελάτε να τα εντοπίσουμε. Κάντε δύο τρεις ασκήσεις ώστε να κολλήσετε εκεί. Εγώ θέλω να κολλήσετε αρχικά. Γιατί αν δεν κολλήσετε σημαίνει ότι είτε τα ξέρετε είτε ότι πέρασαν με ένα τρόπο που δεν άφησα νύχνος επάνω μας. Να κολλήσουμε, να τα δούμε και σιγά σιγά να τα κατακτήσουμε. Είναι σημαντικό. Μην τα αφήνετε αυτά τα θέματα. Πρέπει δε να σας πω, όχι και να ευλογήσω τα γένια του μαθήματος, εξού και το λουκ, όχι τυχαίο, αλλά για να καταδείξω το πόσο χρήσιμο μπορεί να είναι, πως όσοι συμφυτητές και συμφυτήτριες σας μπόρεσαν να φύγουν από το μάθημα με αυτή τη βασική γνώση, χρησιμοποίησαν MATLAB αργότερα, χωρίς μάλιστα να είναι υποχρεωτικό σε μαθήματά τους, κάνοντας τη ζωή τους πάρα πολύ εύκολη. Έχω συναντήσει δηλαδή ανθρώπους, όχι αποφύτους, μεγαλύτερον ετών, οι οποίοι έρχονται και λένε ότι κοίταξε να δεις, οι άλλοι κάνουν δύο εβδομάδες με εξέλ, ας πούμε, και εγώ κάθισα μία ώρα και το έκανα. Αυτή είναι η διαφορά. Είναι μεγάλη υπόθεση. Εδώ θέλω να φτάσουμε, στο να είναι μια επένδυση η οποία θα ξεπληρώσει. Ερώτημα. Όλα τα στοιχεία του χ σε μία στήλη, έτσι. Πράγμα που σημαίνει, ναι, πρακτικά, γιατί μπορεί να υπολογιστεί η μην. Διότι χ άνω κάτω τελείς σημαίνει ότι πάρε τα στοιχεία του χ. Θυμάστε τι σας είχα πει. Ότι για τον υπολογιστή μας δεν υπάρχουν γραμμές και στήλες, ότι όλα τα στοιχεία είναι το ένα μετά το άλλο σε θέσεις μνήμης. Το πρόβλημα είναι ότι όταν μιλάμε για το χ, χωρίς παρενθέσεις τελείς και τα λοιπά, πηγαίνει και βλέπει γραμμές και στήλες, διότι εμείς το έχουμε ορίσει γραμμές και στήλες. Εάν του πούμε να δει τα στοιχεία χ παραίνεσαι άνω κάτω τελείς, είναι σαν να του λέμε πάρε όλες τις γραμμές και στήλες και τελειώσετε, βάλε όλα τα στοιχεία σε μία σειρά, το ένα πίσω από το άλλο. Οπότε ξαφνικά ό,τι πίνακας και να είναι, σχηματίζεται σε έναν πίνακα μιας διάστασης και γι' αυτό η μην τρέχει απευθείας. Δηλαδή, μπορούμε να θέσουμε σε μία χαρακτηρική τοχεία, να έχεις ένα κατελείο και να τζάξεις κατελείες. Ναι, μπορούμε, αλλά δεν χρειάζεται. Μπορούμε. Ναι, βέβαια. Αλλά δεν χρειάζεται. Πρακτικά για εμάς σημαίνει όλα τα στοιχεία. Όλα τα στοιχεία χωρίς διαχωρισμό γραμμών και στυλών. Τώρα, τι άλλο μπορώ να σας πω. Λέγοντας λίγο και, πριν κάνουμε το δεύτερο διάλειμμα μας, και μετά θα δούμε πράγματα που έχουν να κάνουνε γραφικά, που έχουν μεγάλο ενδιαφέρον επίσης. Σε σχέση με το θέμα τώρα, κάποιες παρατηρήσεις που αφορούν το θέμα. Όπως θα είδατε γενικά, πήγαμε καλά βαθμολογικά. Αυτό όμως πρέπει να μεταφραστεί και στο ότι πηγαίνουμε καλά και σε επίπεδο γνώσης και δυνατότητας να αυτονομηθούμε. Βασικά προβλήματα που είδαμε εκεί είναι τα εξής. Κάποια από τα βασικά προβλήματα, σταχειολογώντας. Από τις πρώτες ασκήσεις είδαμε ότι υπάρχει ακόμη ένα θέμα στη χρήση των παρενθέσεων. Πολύ εύκολα αντιμετωπίζει, πολύ λογικό πρόβλημα. Έχει να κάνει μόνο με την έλλειψη εμπειρίας, τριβής, με τίποτα άλλο. Εξάσκηση. Πόση εξάσκηση θα μου πείτε. Πρέπει να κάθομαι ταχ όλα αυτά, δεν αντέχω το αυτομαστήγομα. Πόση εξάσκηση θέλετε για κάτι τέτοιο, θέλετε μισή με μία ώρα, όχι παραπάνω. Θα το κάνετε μία φορά, ασκήσεις δηλαδή όπως οι πρώτες του πρώτου θέματος και θα τελειώσει. Πιστεύω ότι μετά θέσετε σε καλό επίπεδο. Αρκετοί είχαν πρόβλημα στην διανυσματική επίλυση. Θυμάστε, υπήρχε ένα ερώτημα. Να βρείτε το 10 στην μηδενική, στην μηδέν 1, μηδέν 10 στην μηδέν 2, μηδέν 10 στην μηδέν 3. Το θυμάστε, έτσι. Και εκεί η επίλυση ήταν για κάθε στοιχείο, έτσι είπαμε ποιά είναι η λογική. Γράφω 0, 0,1, 0,1. Η χρήση της τελείας τι σημαίνει? Κάτι που το είχαμε δει και επίσης εδώ έχουμε ένα κενό και θέλω να το διευκρινήσω γιατί με ρώτησαν κάποιοι και χθες και με έχουν ρωτήσει και τις προηγούμενες ημέρες. Όταν θέλω να κάνω μια πράξη, στοιχείο προς στοιχείο. Στοιχείο προς στοιχείο δεν θέλω να κάνω. Δεν θέλω να του πω πάρε κάθε στοιχείο αυτού και χρησιμοποιήσέ το ως εκθέτη στο 10. Αυτό δεν θέλω. Δεν είναι πράξη στοιχείο προς στοιχείο. Εξόρυσμου. Η λογική, η σύνταξη δηλαδή που χρειάζομαι στο MATLAB είναι η εξής. Στοιχείο α, πίνακας ότι να είναι όλα, δεν είναι πίνακες στο MATLAB. Τελεία, σύμβολο πράξης, ό,τι κι αν είναι αυτή η πράξη, θα το συμβολήσω έτσι εγώ, σύμβολο πράξης πίνακας β. Οπότε λοιπόν, με αυτό τον τρόπο λέμε ουσιαστικά στο MATLAB ότι θέλω η πράξη μεταξύ α και β να γίνει στοιχείο προς στοιχείο. Μου πείτε το α δεν έχει πολλά στοιχεία ρε φίλε. Είναι ένα, ναι αλλά έχει το β. Θέλω κάθε στοιχείο του α, το δέκα δηλαδή, να γίνει ζευγάρι με κάθε στοιχείο του β, που είναι το μηδέν, το μηδέν, κόμμα ένα, κόμμα δύο, κόμμα τρία, μηδέν, κόμμα τέσσερα, μπλα μπλα μπλα μπλα μπλα, μέχρι το ένα. Σωστά, αυτό δεν θέλω. Βάλε την τελεία λοιπόν και το σύμβολο της πράξης. Αυτό επίσης έχει να κάνει με μια εγγενή, αν θέλετε, πια δυναμία, ένα εγγενές πρόβλημα. Σας δείχνω τι εννοώ. Ελπίζω ότι έχω φορτωμένο MATLAB και δεν θα αργήσει. Γιατί βλέπω κάποια βλέμματα έτσι απορίας εδώ. Λοιπόν, προσέξτε, έχω το δέκα και θέλω να το υψώσω σε ένα διάνυσμα. Μπορώ, βεβαίως, 0 άνω κάτω τελεία 0,1 άνω κάτω τελεία 1. Και ακόμη τρέχει, θα μου πείτε τι κάνει. Νάτο. Λοιπόν, τι έκανε λοιπόν, ξανά. Πήρε το... Ποια είναι η λογική, έτσι όπως τα βλέπετε εσείς. Αριστερά του συμβόλου της πράξης, δεξιά του συμβόλου της πράξης, σύμβολο πράξης στη μέση. Πάντοτε αυτό δεν έχουμε. Ό,τι πράξη και να έχουμε, ύψωση σε δύναμη, πρόσθεση, πολλαπλασιασμό, διέρεση, οτιδήποτε. Το αριστερά του συμβόλου της πράξης παίρνει την τελεία για να πούμε στην πράξη ότι θέλουμε να γίνει στοιχείο προς στοιχείο. Ή τα δύο αυτά θα πρέπει να συμφωνούν τα α και δ ως προς το αναριθμό των στοιχείων τους, να υπάρχει μια σχέση δηλαδή ένα προς ένα, σωστά. 10 στοιχεία το ένα, 10 στοιχεία το άλλο. Ή θα πρέπει να μπορεί να δημιουργηθεί ζευγάρι μεταξύ του ενός α και των πολλών β. Εδώ είμαστε στη δεύτερη περίπτωση. Και είναι μία παρατήρηση, λοιπόν, που αφορά εκείνο το ερώτημα, δεν θυμάμαι, τώρα ήταν το τρίτο θέμα, δεύτερο θέμα. Κάπου εκεί στα πρώτα ερώτημα. Προσέξτε τώρα. Ανευτελίας, όπως είναι. Γιατί, διότι βλέπει πως προσπαθώ να κάνω μία πράξη μεταξύ ενός πίνακα που έχει ένα στοιχείο το 10 και ενός πίνακα που έχει περισσότερα στοιχεία. Και σου λέει, δεν είναι πράξη που μπορεί να γίνει έτσι. Λοιπόν, ένα άλλο στοιχείο πάλι που θέλω να σημειώσω, αυτά που αναφέρω δεν είναι τα πιο σημαντικά, είναι μια επιλογή. Στην 7η άσκηση, εκεί όπου είχαμε τον Κύβο, κάποιοι έκαναν το εξής. Έκαναν σωστά τον υπολογισμό, δηλαδή χρησιμοποίησαν το αποτέλεσμα της 6ης. Θυμάστε, εκείνη τη συνάρτηση που σου έδινε τη δυνατότητα να σπάσεις ένα ρυθμό στα συστατικά του. Χρησιμοποίησαν σωστά αυτή τη συνάρτηση, αλλά ενώ έκαναν έλεγχο του πρώτου, έκαναν έλεγχο του δεύτερου, έκαναν έλεγχο του τρίτου, κρατούσαν τελικά μόνο το τελευταίο. Δηλαδή, είχαν στήσει έτσι τον έλεγχό τους, ώστε ο επόμενος έλεγχος να αντικαθιστά τον προηγούμενο. Οπότε, αν είχαν βρει ότι υπάρχει κίνδυνος ως προς τον πρώτο αριθμό και όχι κίνδυνος ως προς δεύτερο και τρίτο, επειδή ο έλεγχος ήταν στιμμένος έτσι ώστε να κρατά σαν τη λιλική τιμή τον τελευταίο πάντοτε έλεγχο, το αποτέλεσμα του τελευταίου έλεγχου, έβγαζαν από το συμπέρασμα ότι δεν υπάρχει κίνδυνος. Αυτό δηλαδή έκαναν σωστά. Αυτό είναι ένα λάθος λογικό, έτσι δεν είναι. Προγραμματιστικά, ήταν σωστός ο αργόριθμός τους, αλλά ήταν λάθος λογικά. Ξαναλέω, έπρεπε να ελέγξουμε τρεις αριθμούς και να δούμε αν κάποιος από τους τρεις είναι πρώτος. Οποιοςδήποτε και αν είναι πρώτος, συνεπάγεται πρόβλημα, σωστά. Αν όμως ο έλεγχος είναι τέτοιος ώστε η τιμή του κάθε ελέγχου να αντικαθιστά την προηγούμενη, να μην τη βάζετε δηλαδή σε ξεχωριστή μεταβλητή ή σε ξεχωριστή θέση διανύσματος, θα πρέπει να έχετε τρεις τιμές στο τέλος. Και να πείτε, οποιαδήποτε από τις τρεις είναι πρώτος αριθμός, οποιαδήποτε. Κάποιοι όμως, ενδεχομένως από βιασίνη, ή επειδή δεν το είδαν, ή επειδή έτρεχε. Ξέρετε πολλές φορές θεωρούμε ότι επειδή κάτι τρέχει παράει σωστό αποτέλεσμα. Προφανώς και τρέχει. Τι έλεγαν, ελέγχω τον πρώτο αριθμό, ξακ αποδίδω τιμή, ξαναελέγχω αποδίδω τιμή στην ίδια μεταβλητή, ξαναελέγχω αποδίδω τιμή στην ίδια μεταβλητή. Κρατάει την τελευταία. Η τελευταία τι είναι, ασφαλής ο κύβος. Ασφαλές το αποτέλεσμα, λάθος. Επέλεξα λοιπόν αυτά τα τρία, αν θέλετε, χαρακτηριστικά λάθια από τις διάφορετικές γενιές κατηγορίες, ηλικίες, επιτρέψτε μου λαθών. Η πρώτη είναι η, επιτρέψτε μου να πω, η βρεφική ηλικία. Δηλαδή, είναι οι παιδικές ασθένειες από τις οποίες όλοι περάσαμε. Υπάρχει κάποιος από εσάς που δεν πέρασε παιδική ασθένεια κάποια ή δεν εμβολιάστηκε για αυτή. Ένα από τα δύο θα συνέβη. Όλοι λοιπόν περνούμε από την περίπτωση όπου δεν ξέρουμε να χρησιμοποιούμε παρενθέσεις. Κάνουμε αυτό που πρέπει. Ο εμβολιασμός συνίσταται σε ένα πράγμα. Ασκήσεις μισή επί μία ώρα. Όχι κάθε μέρα. Εγώ θα έλεγα μια φορά να κάνετε μία ώρα ασκήσεις, έλειξε. Δεύτερη κατηγορία προβλήματος, ο διανισματικός τρόπος. Εδώ έχουμε μια μεγάλη περιοχή, έχει να κάνει με τη λογική που αναπτύξαμε και στο παράδειγμα. Θέλει περισσότερη δουλειά. Εγώ θα έλεγα ότι εδώ, αν με ρωτούσατε σε επίπεδο προπονητικής εκτίμησης, θέλει τρεις με τέσσερις φορές από μία ώρα. Δηλαδή να πείτε ότι τέσσερις φορές μέχρι το Πέριο Στοξαμίνου θα καθίσω μισή με μία ώρα τη φορά και θα κάνω τέτοιες ασκήσεις. Όπου ή θα ξέρω τις λύσεις ή θα πηγαίνω να τις δείχνω στον καρατζά της λύσης. Για να δω τι έχει γίνει. Το τρίτο είναι κατηγορία λάθους που έχει να κάνει με τη δημιουργία προγραμμάτων και λογικής εκεί. Θα έλεγα να μείνετε στα θέματα που θα κάνουμε. Ήδη τρέχει το δεύτερο θέμα. Είδατε ότι έχει άλλη φιλοσοφία από το πρώτο και το τρίτο θα έχει επίσης άλλη φιλοσοφία από το δεύτερο. Θα σας οδηγήσει δηλαδή στο να χρησιμοποιήσετε αυτού του είδους διαδικασίες περισσότερες φορές. Και εφόσον θέλετε από τώρα, έχουμε προτεινόμενες ασκήσεις στα εργαστήρια, έχουμε και άλλες δράσεις. Αν θέλετε, λάτε να με ρωτήσετε εμένα ή τους βοηθούς του μαθήματος για να σας προτείνω δραστηριότητες. Η άποψή μου είναι, μην το αφήνετε, ο συνολικός χρόνος που θα σας χρειαστεί είναι πολύ λιγότερος από το χρέωνο που θα χρειαστεί να επενδύσετε στο τέλος. Είμαι αναφανδόν δε υπέρ της άποψης πως ο φοιτητής πρέπει να προετοιμάζεται μέσα στο εξάμεινο, διότι αυτό του αφήνει αποτέλεσμα. Θυμάσαι πράγματα και δεν θα φτάσουμε στο τραγικό που θα το ζήσετε αρκετή. Εγώ το έχω ζήσει μαθήματα που δεν τα δούλεψα σωστά, τώρα δεν θυμάμαι τι περιεχόμενο είχαν. Αν ρωτήσεις κάτι θα βαθμολογηθώ με 0, το ομολογώ. Και το δεύτερο, κάνεις την εξέταση πολύ πιο απλή διαδικασία. Άρα δέκα χρόνια, πώς να το πω, δέκα ώρες επένδυσης τώρα μέχρι το πέραστο το εξαμίνου, συνεπάγονται εξοικονόμηση 20 ωρών δουλειάς μετά το πέραστο το εξαμίνου. Είναι δηλαδή θέμα βελτιστοποίησης. Τι θέλετε να κάνετε. Μια επίσης πάρα πολύ χρήσιμη διαδικασία έχει να κάνει με την χρήση πολλαπλών γραφημάτων και μπορώ αυτό να το πετύχω είτε βαφτίζοντας τα γραφήματα, figure 1, λουλούδι 1, λουλούδι 2, οτιδήποτε, ώστε να εμφανίζονται παράλληλα και να μην αντικαθιστά το δεύτερο το πρώτο, είτε να χρησιμοποιήσω την εντολή hold on η οποία πρακτικά λειτουργεί ως μια εντολή που κρατά κάθε γράφημα που παράγεται επί της οθόνης έως ότου εμφανιστεί hold off έτσι ώστε μετά από αυτή να μπορεί καινούργιο γράφημα να αντικαθιστά όλα τα προηγούμενα. Άρα παράγεται ένα πρώτο γράφημα όπου βάζουμε τα στοιχεία εισόδου x1 x1, τα δύο διανύσματα, τα διάφορα specifications, τελείωσε. Θέλουμε μετά όλα τα υπόλοιπα γραφήματα να προστεθούν στο υφιστάμενο, άρα να προσθέσουμε μια δεύτερη καμπύλη ή ένα σχήμα οτιδήποτε και να μην παραχθεί έναν δεύτερο σχήμα το οποίο θα αποκαταστήσει το πρώτο, διότι όπως θα έχετε παρατηρήσει κάθε φορά που παράγουμε ένα σχήμα το προηγούμενο καταργείται, πάει να εμφανίζεται έτσι. Άρα hold on hold off εδώ. Και ένα παράδειγμα όπου με τη χρήση της hold on μπορώ να προσθέσω διαφορετικό χρώμα και διαφορετικά σύμβολα σε δύο καμπύλες. Η μορφωποίηση και η διαχείριση των σχημάτων μπορεί να γίνει πάλι είτε από τη γραμμή εντολών είτε με βάση έναν πανίσχυρο και πάρα πολύ εύχρηστο επεξεργαστή editor που μας δίνει τη δυνατότητα με τη βοήθεια του Kerson να δείξουμε, να αλλάξουμε πάχη γραμμών, να αλλάξουμε χρώμα, συμβολισμούς κλπ. Έτσι λοιπόν, για να δούμε τώρα πώς μπορούμε να παράξουμε ένα γράφημα που συνεπάγεται και μορφωποίηση μάλλον απαιτεί κάποια μορφωποίηση για να μπορέσουμε να δείξουμε το μέγεθος που μας ενδιαφέρει. Προσέξτε λίγο το παράδειγμα. Ένα από τα πολλά σέντε δεδομένων που είναι διαθέσιμα στο MATLAB είναι το sunspot data, το sunspot.dat. Τι είναι αυτό, είναι η συχνότητα εμφάνισης των ηλιακών κυλίδων. Ηλιακές κυλίδες έχουν παρατηρηθεί τα τελευταία 200 και τουλάχιστον χρόνια και ο αριθμός εμφάνισης τους αναέτος είναι γνωστός. Τα στοιχεία αυτά υπάρχουν στο MATLAB. Είναι ένα σπίνακας δύο διαστάσεων, πρώτη στήλη και έχει μία στήλη ετών και μία δεύτερη στήλη αριθμή. Είναι αριθμή volfer ουσιαστικά, δεν είναι ακριβώς η εμφάνιση κυλίδων, είναι ένας αριθμός που υπολογίζεται στη βάση του αριθμού και της ομέγεθος των κυλίδων. Θέλω την προσοχή σας γιατί το παράδειγμα αυτό φέρνει στην επιφάνεια κάποια στοιχεία διανισματικού προγραμματισμού. Κλείνω από εδώ. Φορτώνοντας το αρχείο Sunspot Data μπορώ μετά να πλωτάρω τα αίτη και τον αριθμό κυλίδων. Έτσι δεν είναι τα αίτη που βρίσκονται στην πρώτη στήλη. Κάθε γραμμή, κόμμα, πρώτη στήλη ποιού του Sunspot. Οι αριθμοί κυλίδων που βρίσκονται στη δεύτερη στήλη. Κάθε γραμμή σημαίνει άνο, κάτω, τελεία, κόμμα, δεύτερη στήλη. Και να χρησιμοποιήσω μια μαύρη γραμμή, K, ο κωδικός. Να βάλω ως label ως τίτλο στον άξονα των X, gear. Να βάλω ως αντίστοιχο label στον άξονα των Ψ, Wolfer number. Και τώρα να βάλω και ένα τίτλο, title Sunspot Data. Βλέπετε ότι όλα τα στοιχεία κειμένου μπαίνουν ανάμεσα σε απλά εισαγωγικά. Μέχρι στιγμής πάρα πολύ απλό. Προσέξτε τώρα το εξής. Θέλω να βρω τη μέγεστη τιμή και τη θέση της μέγεστης τιμής για όλα αυτά τα έτη, γιατί έχω στοιχεία από το 1700 και μέχρι το έτος 2000. Θέλω να βρω λοιπόν για όλα αυτά τα έτη το μέγεστο αριθμό Wolfer και τη θέση του μέγεστο αριθμού Wolfer. Η εντολή max, εάν αναθέσει το αποτέλεσμα σε δύο τιμές μέσα σε διάνισμα, τότε κάνει το εξής. Παράγει τη μέγεστη τιμή ποιού του sunspot, τι θέλουμε εμείς, τη μέγεστη τιμή του έτους ή του αριθμού Wolfer, του δεύτερου. Άρα, δεύτερη στήλη. Σαρώνω λοιπόν τη δεύτερη στήλη για να βρω το max. Πολύ ωραία. Σε ποια θέση βρίσκεται το max. Η εντολή max δίνει εδώ ένα αποτέλεσμα που ανατίθεται σε δύο τιμές. Μέγεστη τιμή και θέση. Αύξον αριθμός στοιχείου. Είναι για παράδειγμα το στοιχείο 185. Σημαίνει ότι το στοιχείο 1 είναι το έτος 1800 και το 185 είναι το έτος 1885, για παράδειγμα. Θέλω να προσθέσω μια τελεία, έναν κόκκινο μικρό κύκλο στο σημείο της μέγεστης τιμής. Άρα, θέλω στη βάση του εφιστάμενου γραφήματος να προσθέσω ένα δεύτερο γράφημα. Θα χρησιμοποιήσω την hold on για να κρατήσω το πρώτο γράφημα ενεργό. Και μετά θα του πω ότι, κοίταξε να δεις, θέλω να μου βάλεις που εκεί όπου έχω τις τεταγμένες από το stand-spot στη θέση της μέγεστης τιμής max position σε αυτό το έτος και στην πρώτη στήλη. Εκεί λοιπόν, αυτή είναι η τετμημένη και η τεταγμένη είναι max-val. Άρα, του λέω, βάλε μου στο σημείο με x stand-spot max position 1 και ψή max-val τι έναν κύκλο, ένα marker size 20. Άρα, μπορώ να προσθέσω ένα δεύτερο γράφημα. Ο κύκλος μου είναι έναν δεύτερο γράφημα. Και μετά, βέβαια, να προσθέσω και κείμενο, που κι αυτό έχει ενδιαφέρον. Πού θα το βάλω το κείμενο? Θα το γράψω με τον editor, πολύ πιο εύκολο. Ή θα θέλω να το κάνω προγραμματιστικά. Πρέπει να του πω, βάλε text εκεί όπου υπάρχει στο x max position 1 μειών 100, 100 θέσεις πίσω, για να προσθέσω ένα κείμενο που γράφει max-val from number tether. Και σε μεγαλύτερο μέγεθος, εδώ. Αυτές οι διαφάνεις υπάρχουν στο e-class. Και μπορείτε να πειραματιστείτε κι εσείς. Μια άλλη λειτουργία που είναι πολύ συνηθισμένη είναι το να επιμερήσω ένα σχήμα σε επιμέρους σχήματα. Για παράδειγμα, θέλω ένα βασικό σχήμα επάνω και δύο υποσχήματα κάτω. Να, ένα παράδειγμα εδώ. Θέλω μύτωνο, συνημύτωνο και κάποιες γωνίες εδώ. Πάλι μπορώ να το κάνω χρησιμοποιώντας subplots. Η εντολή εδώ είναι η subplot. Όχι λοιπόν ένα βασικό plot, αλλά subplot. Χρήσιμο το να χρησιμοποιήσω λογαριθμική κλίμακα όταν έχω πολύ μεγάλες τιμές. Προσέξτε αυτό για παράδειγμα. Έχω εδώ την A στην τρίτη, μάλλον την X στην τρίτη. Σε γραμμική κλίμακα είναι μια μη ορατικά μπύλη, η οποία σε λογαριθμική κλίμακα γίνεται ορατικά μπύλη. Τι μπορώ να κάνω σε τρεις διαστάσεις. Είναι μόνο μια πολύ μικρή pot-πουρή από γραφικές παραστάσεις. Σε τρεις διαστάσεις μπορώ να κάνω επίσης γραφήματα τριών διαστάσεων χρησιμοποιώντας την plot 3. Αντίστοιχη λογική, X, C, Z. Θέλω τρία διανύσματα εδώ. Να πως μπορώ να παράξω ένα υλικό ιδέες. Εδώ η X είναι η A στην μειών τάφ δια 10 επί η μύτωνο τάφ. Η Ψ είναι επί συνυμύτωνο τάφ και η Z είναι η τάφ τετράγωνο. Παράγει αυτό το πολύ όμορφο αποτέλεσμα. Αυτή την μεταβαλόμενου εύρους σπήρα. Προφανώς για όσους έχουν παίξει ήδη στο μάτλαμ ή στο οκτέιβ γιατί είναι ταυτόσιμα ως προς τα γραφήματα τα περιβάλλοντα αυτά υπάρχει δυνατότητα να περιστρέψει κανείς αυτά τα γραφήματα και άρα να τα δει από άλλη οπτική κάτωψη, άνοψη, πλάγια όψη να διερευνήσει δηλαδή στοιχεία των γραφημάτων αυτών να κάνει κλικ πάνω σε συγκεκριμένα σημεία και να πάρει τις αριστημητικές τιμές, τα Hips και Z των σημείων αυτών το ίδιο σε οκτέιβ. Και βέβαια δεν μπορώ να κάνω μόνο σχήματα στον χώρο αλλά και επιφάνειες στον χώρο. Εδώ βλέπετε την συνάρτηση surf και τη συνάρτηση mesh που χρησιμοποιούνται για να κατασκευάσουμε είτε μία επιφάνεια αριστερά είτε έναν κάναβο με επιφάνεια δεξιά. Η surf και η mesh αντίστοιχα. Και ταυτόχρονα βλέπουμε την εγενή συνάρτηση peaks του MATLAB η οποία έχει στοιχεία για αυτό το συγκεκριμένο σχήμα. Έχει δηλαδή τις συνταταγμένες Hips και Z που οδηγούν σε αυτό το συγκεκριμένο σχήμα. Από εκεί και πέρα είτε mesh Hips και Z είτε surf Hips και Z παράγουν το αντίστοιχο αποτέλεσμα. Τα Hips πρέπει να είναι ο πίνακας που θα αποικονιστεί στον άξονα H και Ψ αντίστοιχα και ο Z ο πίνακας που θα αποικονιστεί στον άξονα Z. Και εδώ μπαίνει στο παιχνίδι η mesh grid που έχετε ήδη ως μία δυνατότητα στο δεύτερό σας θέμα. Η mesh grid η οποία κάνει τι? Η οποία παίρνει ένα διάνισμα τιμών και το αναπαράγει. Παίρνει για παράδειγμα μια γραμμή τιμών και την αναπαράγει. Παίρνει μια στήλη τιμών και την αναπαράγει. Άρα δημιουργεί έναν κάναβο τιμών. Μπορεί να δημιουργήσει συντεταγμένες κατά H και κατά Ψ. Συντεταγμένες σε ένα επίπεδο λοιπόν. Με αυτό τον τρόπο μπορώ να δημιουργήσω τα διανείσματα H και Ψ με mesh grid αντίστοιχα από μίον 2 έως 2 με 2.0.2 και να δω μετά για κάθε σημείο H και Ψ το ε στην μίον χ τετράγωνο μίον ψ τετράγωνο που οδηγεί σε αυτήν εδώ την καμπύλη. Μάλλον σε αυτήν εδώ την επιφάνεια στο χώρο. Την οποία επιφάνεια μπορώ να δω με τη surf. Είναι μια ωραία επιφάνεια γιατί είναι ένα καλό παράδειγμα απόλυτου μεγίστου, απόλυτου ελαχίστου και όχι τοπικών μεγίστων και ελάχιστον. Τι άλλο μπορώ να κάνω σε περίπτωση που έχω την ανάγκη να δημιουργήσω ισοσυγκεντρωσιακές, ισοτασικές ισοκαμπύλες, η εντολή contour μου δίνει αυτή τη δυνατότητα. Μπορώ να έχω καμπύλες, μπορώ να έχω χρωματισμένες επιφάνειες, μπορώ να αλλάξω επιφάνειες, μπορώ να αλλάξω ψευδοχρώμα και να δώσω χρώμα στις επιφάνειες και να προσομοιώνει πραγματικά υλικά, μεταλλο, πλαστικό κτλ. και ανάλογα να διαμορφώσω μια ρεαλιστική εικόνα. Και πολύ εύκολα επίσης μπορώ να προσδώσω κινηματογραφικότητα, δηλαδή στις τρεις διαστάσεις το μάτυλα μου δίνει τη δυνατότητα να προσθέσω πηγές φωτός, να προσθέσω σκιά κτλ. Σε πολλά προβλήματα έχουμε να κάνουμε με μεγέθη τον οποίο αλλάζει το gradient, αλλάζει η κλήση. Τυπικό τέτοιο πρόβλημα είναι η κλήση πίεσης γύρω από στερεό. Ας το κάνουμε συγκεκριμένο. Όταν ένα αεροσκάφος πετά κοντά σε ένα βουνό, τότε αυτό το στερεό μεταβάλλει την κλήση πίεσης του ρευστού της ατμόσφαιρας, δηλαδή πέριξτου στερεού. Αυτή η κλήση πίεσης είναι από φασιστική σημασία για τη συμπεριφορά του ρευστού και του αεροσκάφους. Εδώ λοιπόν βλέπουμε την κάτωψη δύο βουνών και βλέπουμε τι, στη μία περίπτωση, πώς καταλαβαίνω ότι είναι βουνά, εδώ έχω ανωδικό ρεύμα και εδώ έχω μια κοιλάδα, έχω καθοδικό ρεύμα. Τώρα μπορώ να πλωτάρω τμήμα εννιάς επιφάνειας. Κάτι που δεν έχει τόσο ενδιαφέρον, αλλά το άλλο στοιχείο που έχει ενδιαφέρον είναι το εξής. Το να δω άλλου είδους γραφήματα που μου είναι πάρα πολύ χρήσιμα στην ανάλυση δεδομένων. Ένα είδος γραφημάτων που είναι πολύ χρήσιμα στην ανάλυση δεδομένων είναι το ιστόγραμμα. Θα κάνετε πολύ περισσότερο, για στατιστική ανάλυση δεδομένων στο αντίστοιχο μάθημα της στατιστικής. Άρα πόσες είναι οι περιοχές τιμών στις οποίες πρέπει να χωρίζετε το δείγμα σας εδώ, με ποιον τρόπο υπολογίζονται τα έυρη των τιμών αυτών, κτλ. Μπορώ να δημιουργήσω καμπύλες λάθους. Άρα έχω μία μέτρηση και έχω τα λάθη ως ένα έυρος τιμών γύρω από την μέση τιμή, ένα έυρος τιμών ίσο με την τυπική απόκλειση. Αυτό μου δίνει τη δυνατότητα πολύ γρήγορα να εκτιμήσω το εξής. Μία μέτρηση μεγέθους μηδέν, μέσης τιμής μηδέν, με τυπική απόκλειση 1, πρακτικά σημαίνει ότι μπορώ να έχω μια τεράστια απόκλειση. Μπορώ προφανώς να δημιουργήσω πολικά διαγράμματα, γενικά σε περιβάλλον μάτλαβ και οκτέιβ. Έχω τη δυνατότητα να δημιουργήσω οποιαδήποτε διαγράμματα. Μαθηματικά έχουν νόημα και μου είναι χρήσιμα. Ένα παράδειγμα πολικού διαγράμματος στο 1 μίον ημί τον θήτα. Κλασικό διάγραμμα. Προφανώς... μην είστε τόσο ζοηροί. Προφανώς να απεικονήσω μηγαδικούς. Οι μηγαδικοί είναι διανύσματα στον χώρο. Μάλλον συγκεκριμένα στο επίπεδο. Και βέβαια να απεικονήσω εικόνες. Κάτι που είναι ίσως πιο ενδιαφέρον για εσάς. Ξέρετε πλέον ότι οι εικόνες χωρίζονται σε πιξελάκια και άρα έχω χρωματικές κλίμακες. Αυτό έχουμε δει με τη βοήθεια του πρώτου θέματος. Άρα κάθε εικόνα ουσιαστικά αντικατοπτρίζεται σε πίνακα. Μάλλον αντιστοιχεί σε πίνακα. Και έχω και την κωδικοί πίνακες. Άρα εδώ έχω μη γραμμές επί νηστήλες. Επί τρεις διαστάσεις. Μία για red, μία για green. Και μία επί τρία επίπεδα. Μία για red, μία για green, μία για blue. Άρα έχω τρεις πίνακες. Οι τιμές του κάθε πίνακα αντιστοιχούν στο ποσοστό κόκκινο, πράσινο και μπλε. Άρα λοιπόν ένα πίξελ εδώ δεν αντιστοιχεί μόνο σε μία τιμή. Αντιστοιχεί σε μία τριπλέτα τιμών. Τι ποσοστό είναι red, τι είναι green και τι είναι blue σε αυτή την κωδικοποίηση. Και κοιτάξτε εδώ ένα παράδειγμα. Έχω τα αρχεία για όποιον ενδιαφέρεται. Είχα ψάξει και είχα βρει την εικόνα ενός μήλου. Το αρχείο μου ήταν ένα Apple JPG. Και είχα ψάξει επίσης να βρω και μία άλλη εικόνα που να έχει τέτοιου σκικλική μορφή. Και βρήκα μια φωτογραφία δορυφορική της έτνας του ηφαιστείου. Δεν φαίνεται πολύ καλά εδώ. Είναι χιονισμένη η έτνα. Και από ψηλά, επειδή είναι ένα σκόνος, φαίνεται στρογγυλή. Πώς μπορώ να δω εικόνες που έχω σε μορφή JPG και τελικά σε MATLAB. Διαβάζω την εικόνα με την ImageRead και αποδίδω την τιμή σε έναν πίνακα. Εδώ Apple και Λεωνίδα να το ονομάζω κανένα πρόβλημα. Και μετά θα έλεγα ImageShow, δείξε μου τον Λεωνίδα. Το περιεχόμενο του πίνακα που έχει τις τιμές του Image. Όμοια και για την έτνα. Κάντε αυτό, ίσως να έχει ένα ενδιαφέρον. Καλά, τι άλλο μπορώ να κάνω. Στο συγκεκριμένο παράδειγμα το size της έτνας ήταν 432x432x3. Η εντολή size σε έναν πίνακα μου δείχνει αριθμό γραμμών στυλών και επίπεδα. Άρα ήταν 432 γραμμές και στύλες και 3 επίπεδα. Ενώ το size του πίνακα που αντιστοιχούσε στο μήλο ήταν 1800 γραμμές και στύλες, 3 επίπεδα. Ένα πράγμα που ήθελα να κάνω εγώ, γιατί είχα μια πονηρή ιδέα στο μυαλό μου, να συνδυάσω την έτνα με το μήλο, ήταν να ξανακάνω scaling αυτά τα δύο ώστε να αποκτήσουν το ίδιο size. Image size. Οπότε λοιπόν μπορείς ένα διάνισμα ποιο είναι μικρό, αυτό, να το φέρω στο μέγεθος της έτνας. Άρα αντί για 432 γραμμές και στύλες, να το φουσκώσω, να του προσθέσω τιμές τόσες και με τέτοια αναλογία ώστε να φτάσει να γίνει 1800 επί 1800. Πώς το κάνω αυτό, χρησιμοποιώντας την image size και του λέω, πάρε το β, ως αποτέλεσμα του image size πια νου του α, με τόσες γραμμές και τόσες στύλες. Άρα, αν εδώ στη θέση του α θα βάλω την έτνα και στη θέση των γραμμών και στυλών 1800, θα παράξω μια νέα εικόνα της έτνας, που πλέον δεν θα έχει 432 στοιχεία σε γραμμές και στύλες, θα έχει 1800. Θα μου πείτε πώς το κάνει. Αντιγράφει, έτσι, γραμμές και στύλες, αντιγράφει. Και γιατί το έκανα αυτό, γιατί ήθελα να παράξω μια εικόνα υφεστιόμιλου, έτσι, δηλαδή να βάλω υφέστιο και μίλο μαζί. Πώς θα το έκανα με συμβατικό προγραμματισμό, κύριοι, εσείς εκεί, πώς θα το κάνατε συμβατικά. Θα χρησιμοποιούσατε ένα τριπλο-λούτ. Για κάθε γραμμή, i από 1 έως, προσέξτε χρησιμοποιώ την size, ώστε να μην εξαρτώμε από το μέγεθος του πίνακα, η size βρίσκει το μέγεθο αριθμό γραμμών. Γιατί, size του πίνακα apple, 1, στη βρώτη διάσταση, άρα μέγεθος το αριθμό γραμμών, κόμμα 2, μέγεθος το αριθμό στυλών, κόμμα 3, μέγεθος το αριθμό επιπέδων, αν έχει τέσσερις διαστάσεις ο πίνακας, μπορεί βεβαίως, 5, 6, ανά διάσταση. Άρα λοιπόν, για i από 1 έως, το size του apple, το αριθμό γραμμών, στυλών και επιπέδων, υπολόγησε μου ως καινούριο στοιχείο πίνακα, εγώ τι κάνω εδώ, την μέση τιμή της τιμής του πίνακα μήλο, για το συγκεκριμένο ijk και étna new ijk. Και έτσι λοιπόν, έχω μία εικόνα που έχει πάρει πληροφορία από τον πίνακα μήλο, πληροφορία από τον πίνακα étna, και η νέα εικόνα είναι μήλο συνέτηνα διά δύο, γι' αυτό και είναι λίγο έτσι παράξενη. Πάλι δεν φαίνεται πολύ καλά, αλλά είναι ένα μήλο, φαίνεται το περίγραμμα, που στη μέση της υπάρχει το υφέστιο. Πώς θα το έκανα τώρα διανισματικά, επειδή προφανώς έχουμε συζητήσει τις προηγούμενες ώρες για αυτό και σημειώσαμε την μεγάλη χρυσιμότητα του διανισματικού προγραμματισμού. Παρά, image new is an apple συνέτηνα διά δύο, διότι έχουν το ίδιο size, έτσι δεν είναι. Δεν τέντωσα εγώ την έτηνα ώστε από 432 από 432 γραμμές στήλες να πάρει στο 1800 επί 1800. Άρα μπορώ να πάω και να ρίξω πάνω σε κάθε στοιχείο του πίνακα apple το αντίστοιχο στοιχείο της νέας έτηνας και να του πω υπολόγησέ μου ένα νέο πίνακα που το κάθε στοιχείο του θα είναι η μέση τιμή του αθλήματος των δύο προηγουμένων. Απλό, ο χρόνος υπολογισμού στην πρώτη περίπτωση όταν το είχα κάνει ήταν 15 δευτερόλεπτα. Πώς το κάνω αυτό, χρησιμοποιώ τις δύο εντολές που έχουμε ξανααναφέρει, tick tock. Πρώτος χτύπωση ρολογιού, tick, ξεκινά και μετρά ο χρόνος. Tock, τελευταίος. Ό,τι υπάρχει ενδιάμεσα θα πρέπει να εκτελεστεί πριν φτάσουμε στο tock. Με το που θα δει το tock, θα δει τι χρόνο έδειχνε το ρολόι, το εσωτερικό του υπολογιστή στο tick, θα υπολογίσει τη διαφορά. 15 δευτερόλεπτα με απλό τρόπο, 0,04 δευτερόλεπτα διανισματικά. Είναι προφανώς μεγάλο το πλεονέκτημα που έχουμε εδώ. Τι άλλο? Δεν φαίνεται πολύ καλά. Αυτό που σας δείχνω εδώ είναι το λεγόμενο είμα, η λεγόμενη εικόνα θορύβου τύπου αλατοπίπερο. Και θα εξηγήσω αφού πρώτα απαντήσουμε σε ένα ερώτημα. Ροματικά δεν υπάρχει για τα κάθε χρώμα, τι υπάρχει με τη διάρκεια μου μέχρι το επίπεδο. Με το εσωτερικό του υπολογιστό, όπως είχαμε, τι εξηγητάσεις. Στο red, green, blue. Υσχύει κάτι δύσκολο στο τέλος. Ακριβώς, διότι εδώ τι κάνουμε, ουσιαστικά, όταν λέμε ότι υπολογίζει τη τιμή σε κάθε pixel, σε κάθε pixel έχω τρεις τιμές ουσιαστικά, μία red, μία green, μία blue. Άρα, είναι σαν να έχω, επειδή βλέπω πολλά σχέδια μπροστά σας, είναι το αγαπημένο σας άθλημα, σαν να έχω τρία σχέδια, ένα σχέδιο μόνο red, ένα μόνο green, ένα μόνο blue. Έχουμε τεντώσει την έτνα ώστε να είναι της ίδιας διάστασης σχέδιο με το σχέδιο μήλο. Και μετά του λέω, σε συγκεκριμένα σε κάθε σημείο, πάρε το red της έτνας με το red... Εδώ, κοιτάξτε. Εδώ θα είναι το καλύτερα. Τα i και τα j είναι γραμμές και στήλες, τα k είναι τα χρώματα. Άρα, κάντε για k1 το red, για k2, για k3, βρες την μέση τιμή και μετά αυτό επανέλαβε το για κάθε i και για κάθε j. Οπότε λοιπόν, πρακτικά, γι' αυτό θέλω ένα τριπλό loop εδώ, γι' αυτό το λόγο και θα ρωτήσω το εξής. Χονδρικά, ποια είναι η υπολογιστική πολυπλοκότητα εδώ, μπορεί κάποιος να μου πει. Που οφείλετε ρε να πάρει ευχή γι' αυτό το 15. Το βλέπετε μπροστά σας, να αναρωτηθούμε λίγο. Γιατί είναι 15. Κάτι κοστίζει πολύ σε χρόνο, είπαμε πληρώνουμε. Τι κοστίζει πολύ σε χρόνο, το ότι πρέπει να σαρώσω όλα τα k για όλα τα j και για όλα τα i. Άρα, στη γενική περίπτωση έχω ένα j επί k επί i. Αν ήταν ν, θα ήταν ν τρίτης. Είναι κυβικής ρίζας πολυπλοκότητα. Ν τρίτης κοστίζει. Ενώ εδώ, επειδή είναι βγενισματικό, είναι τρία ν. Ένα ν αναχρώμα. Είναι μια πράξη αναχρώμα. Ωραίο, ε? Αυτή είναι η διαφορά. Γι' αυτό και έχουμε αυτή την τεράστια απόκλειση. Έχουμε άλλα τα 15 δευτερόλεπτα εδώ και άλλα τα 0,05 εδώ. Αυτό που μπορούμε γενικά να κάνουμε, όχι μόνο στο άσπρο και στο μαύρο, μπορούμε να αλλάξουμε τον χρωματικό τόνο. Αν είναι ασπρό-μαύρη φωτογραφία, μπορούμε να του πούμε, για παράδειγμα, θυμάστε στο ασπρό-μαύρο πόσες ήταν οι τιμές, θυμάστε? Από μηδέν έως... 64 ήταν η χονδροειδής κωδικοποίηση. Μια 200... Έλα, ε! 256. Ναι, ναι, αφού το ξέρετε. 256. Άρα, λοιπόν, τι αντιστική σε άσπρο, τι αντιστική σε μαύρο. Ποιος θυμάται? Τι σε μαύρο, τι σε άσπρο. Αν είναι το 0 το μαύρο, λοιπόν, και το 256 το άσπρο, και έχω μια ασπρό-μαύρη φωτογραφία, τότε, αν θέλω να την μετακινήσω προς το μαύρο, μπορώ να αφαιρέσω τιμές. Άρα, θα τη σκουρίνω. Αν θέλω να την κάνω πιο ανοιχτόχρωμη, θα προσθέσω τιμές. Αν, όμως, δεν είμαι στο ασπρό-μαύρο και είμαι σε red-green-blue, και θέλω, για παράδειγμα, να αφαιρέσω κόκκινο, μπορώ να αφαιρέσω τιμές μόνο από το επίπεδο του red. Αν θέλω να αφαιρέσω πράσινο, να αφαιρέσω από το green. Και, βέβαια, θα πρέπει να έχω γνώση του, τι συμβαίνει σε ένα χρώμα, αν του αφαιρέσω ποσοστό κόκκινου. Προς ποιο μεταφέρεται. Ή τι θα συμβεί σε ένα χρώμα, αν του αφαιρέσω ποσοστό πράσινου ή μπλε. Αυτού του είδες τη δουλειά, επιτελούν όλα τα φίλτρα που έχουν ενσωματωμένα, τα προγράμματα επί εξεργασίας εικόνων, που χρησιμοποιείται σε κινητά, φωτογραφικές μηχανές, υπολογιστές, κλπ. Αυτό, λοιπόν, που θα σας δείχνω εδώ, είναι κάτι άλλο και σας το επιδεικνύω επειδή θα μπούμε σιγά σιγά από το επόμενο μάθημα σε τυχαίους αριθμούς από την επόμενη εβδομάδα. Είναι ο λεγόμενος θόρυβος αλατοπίπερου. Τι σημαίνει αυτό? Ο θόρυβος είναι ένα τυχαίο σήμα. Όπως έχει αποδειχθεί από τους μεγάλους θεμελιωτές αυτής της περιοχής, από των σάνων και μετά, ο θόρυβος έχει τυχαιότητα, η οποία όμως μπορεί να περιγραφεί. Αυτό που βλέπετε εδώ είναι διάσπαρτες μαύρες κουκίδες σε λευκή επιφάνεια. Γι' αυτό και ονομάζεται θόρυβος αλατοπίπερου. Είναι σαν να ρίχνεις σαλάτι και πιπέρι σε μια επιφάνεια ουδέτερη, ας πούμε. Οπότε τελικά θα έχεις μόνο ασπρόμαυρα. Και, πηγαίνοντας προς το τέλος, δύο πράγματα. Ανώνυμε συναρτήσεις και βίντεο. Όσο προς τις ανώνυμε συναρτήσεις, εάν θέλω να κάνω την γραφική παράσταση, για παράδειγμα, της χ3-χ4-1, μπορώ να χρησιμοποιήσω τον χειριστή At, ο οποίος λέει στον υπολογιστή ότι δεν χρειάζεται να έχει τιμές χ, μπορεί να τον χρησιμοποιήσει σαν συμβολική μεταβλητή. Και έτσι λοιπόν βαφτίζω τη συναρτήση μου f, ίσον συμβολική συναρτήση ως προς χ, με σχέση χ3-χ4-1 και αντί της plot χρησιμοποιώ την ez plot, για να κάνω την γραφική της παράσταση. Βαφτίζω τη συναρτήση μου f, με διάστημα τη μόνο από μήνων 3-3. Το ίδιο εδώ, πιο όμορφη και ενδιαφέρουσα είναι αυτή, που μοιάζει με μεταλλουποχύτευση, το οποίο πέφτει από ένα μεγάλο επίπεδο σε ένα μικρότερο επίπεδο. Ή εδώ όπου έχω τη γεωμετρία ενός ελατηρίου. Προφανώς με ενδιαφέρει, πρέπει να σας πω πολύ, τι είναι οι σχέσεις που περιγράφουν μηχανολογικές κατασκευές ή συμπεριφορές συστημάτων, γιατί έτσι μπορώ να τις μελετήσω. Και για να δούμε και στο τέλος δύο κουβέντες, γιατί είναι μεγάλη ιστορία, για το πώς μπορώ να γράψω και να αναπαράξω ταινία. Εδώ δεν είναι τόσο ενδιαφέρον στη ταινία, εις το ότι έχω αυτή την εικόνα. Και θέλω να δημιουργήσω παραλλαγές σε αυτής της εικόνας, κάθε παραλλαγή να αντιστοιχεί σε ένα frame και να παίξω τα frame το ένα μετά το άλλο, έτσι ώστε να δημιουργηθεί η ψευδέστηση της κίνησης. Μπορώ να το κάνω σε μάτλανδο αυτό βεβαίως. Άρα μπορώ να δημιουργήσω την εικόνα εδώ με την PIX και μετά να δημιουργήσω τα 20 frames, αλλάζοντας μια πολύ μικρή παράμετρο στη συγκεκριμένη εικόνα και δημιουργέτοντας κάθε frame στην μεταβλητή M2J με τη βοήθεια της get framing. Get frame ουσιαστικά χρησιμοποιεί την κάθε εικόνα ως frame σε ένα σύνολο από τη mesh και δημιουργεί ένα struct, μια δομή δεδομένων, όπου το κάθε στοιχείο του struct αντιστοιχεί σε ένα επίπεδο, αντιστοιχεί σε ένα frame. Με αυτό τον τρόπο μετά μπορώ με τη χρήση της movie να παίξω σε εισαγωγικά το περιεχόμενο του struct M όσες φορές του πω, 20 φορές. Οπότε αν το κάνετε αυτό, αυτό προσπάθησα να τρέξω και γι' αυτό βλέπατε το MATLAB να σέρνεται, το ξεκίνησα χθες στο σπίτι και σε αυτό τον υπολογιστή ακόμη υπολογίζει το πόσες φορές θα το παίξει. Σε αυτόν που έχω στο γραφείο απλά το κάνει χωρίς να το σκεφτεί. Αυτή είναι η διαφορά. Εμφανίζεται λοιπόν μια καμπύλη εδώ, σκεφτείτε τα βουνά και τις σκυλάδες, να εμφανίζονται το ένα μετά το άλλο και επειδή δεν μπορούσα να το εμφανίσω λόγω του υπολογιστή σας έκανα αντίγραφα κάποιων frames. Άρα μπορείς να δημιουργήσεις μία εικόνα και παραλλαγή και να έχεις μία ψευδέστηση κίνησης. Αυτό μπορείς να το χρησιμοποιήσεις για να κάνεις μία προσωμίωση. Θέλεις να δείξεις μία βολή, σώματα που κινούνται, να δείξεις σφαίρες μπιλιάρδου μετά από κρούση. Πώς θα το κάνεις? Με εμφανόμενες θέσεις που παίζονται μία μετά την άλλη ώστε να σε δημιουργήσουν την ψευδέστηση της εικόνας. Με αυτά λοιπόν τελειώνουμε σήμερα. Κι εσείς θα τα πούμε την άλλη εβδομάδα.