solarpower Δημοσ. 10 Μαΐου 2017 Δημοσ. 10 Μαΐου 2017 @SheogorathTo reference(i+n,j,k) τρώει χρόνο για να υπολογίσει δείκτες. Δες πόσες φορές το έχεις δεξιά του ίσον. Χρειάζεται μια φορά για να πάρεις την τιμή και μια φορά αριστερά του = (στην εκχώρηση) για να βάλεις τιμή. Τις άλλες φορές το έχεις σε μεταβλητή. Για να το καταλάβεις: ένα b θέλει χρόνο για να διαβαστεί, φαντάσου τα i,n,j,k και το reference (5 δηλαδή) επί 3 φορές που τα χρησιμοποιείς το μέγιστο (αποτυχία του πρώτου if, επιτυχία του δεύτερου και χρήση πάλι για να αφαιρεσεις 1, μιλάμε για 15 χρόνους ας πούμε ισοδύναμους με 3 του b, και βάλε μια ακόμα για την εκχώρηση, άρα 4 για το b. Η αναλογία, χονδρικά είναι 15/4, περίπου δηλαδή τέσσερις φορές πιο αργός ο κώδικας αν δεν χρησιμοποιήσεις μεταβλητή. 1
Sheogorath Δημοσ. 10 Μαΐου 2017 Μέλος Δημοσ. 10 Μαΐου 2017 @Sheogorath To reference(i+n,j,k) τρώει χρόνο για να υπολογίσει δείκτες. Δες πόσες φορές το έχεις δεξιά του ίσον. Χρειάζεται μια φορά για να πάρεις την τιμή και μια φορά αριστερά του = (στην εκχώρηση) για να βάλεις τιμή. Τις άλλες φορές το έχεις σε μεταβλητή. Για να το καταλάβεις: ένα b θέλει χρόνο για να διαβαστεί, φαντάσου τα i,n,j,k και το reference (5 δηλαδή) επί 3 φορές που τα χρησιμοποιείς το μέγιστο (αποτυχία του πρώτου if, επιτυχία του δεύτερου και χρήση πάλι για να αφαιρεσεις 1, μιλάμε για 15 χρόνους ας πούμε ισοδύναμους με 3 του b, και βάλε μια ακόμα για την εκχώρηση, άρα 4 για το b. Η αναλογία, χονδρικά είναι 15/4, περίπου δηλαδή τέσσερις φορές πιο αργός ο κώδικας αν δεν χρησιμοποιήσεις μεταβλητή. Δεν το γνώριζα, θα το αλλάξω λογικά σήμερα, μαζί με τα vectors αντί του for, και θα επανέλθω!
Sheogorath Δημοσ. 12 Μαΐου 2017 Μέλος Δημοσ. 12 Μαΐου 2017 Για παράδειγμα, δοκίμασε να διώξεις το k loop: k=[1:3]; limit=382*679; for i=1:8:1080 for j=1:1920 p=p+1; if p>limit break; end str1=dec2bin_2(secret(p,k)); for n=0:7 str2=dec2bin_2(reference(i+n,j,k)); str2(8)=str1(n+1); if (str2(8)==1)&&(mod(reference(i+n,j,k),2)==0) reference(i+n,j,k)=reference(i+n,j,k)+1; elseif (str2(8)==0)&&(mod(reference(i+n,j,k),2)==1) reference(i+n,j,k)=reference(i+n,j,k)-1; end end end end Ναι, έπεσε σε δυόμιση δευτερόλεπτα. Υποκλίνομαι. 1
Dr.Fuzzy Δημοσ. 12 Μαΐου 2017 Δημοσ. 12 Μαΐου 2017 Ναι, έπεσε σε δυόμιση δευτερόλεπτα. Διώξε αν θες και τα άλλα loop και θα πέσει σε msec.
Sheogorath Δημοσ. 12 Μαΐου 2017 Μέλος Δημοσ. 12 Μαΐου 2017 Διώξε αν θες και τα άλλα loop και θα πέσει σε msec. Το έκανα αλλά βγάζει για κάποιο λόγο όλο μαύρη εικόνα στο 2ο. % p=0; j=[1:s_Mask2]; i=[1:8:s_Mask1]; k=[1:3]; %for i=1:8:s_Mask1 %for j=1:s_Mask2 p=p+1; if p>limit break; end %for k=1:s_Mask3 str1=dec2bin_2(secret(p,k)); for n=0:7 str2=dec2bin_2(reference(i+n,j,k)); str2(8)=str1(n+1); if (str2(8)==1)&(mod(reference(i+n,j,k),2)==0) reference(i+n,j,k)=reference(i+n,j,k)+1; elseif (str2(8)==0)&(mod(reference(i+n,j,k),2)==1) reference(i+n,j,k)=reference(i+n,j,k)-1; end end %end %end %end Όπου s_Mask1 το 1080 και s_Mask2 1920. Τους operators τους άλλαξα για vector & αντί για &&. Τι κάνω λάθος? Eίδα σε παράδειγμα έβγαζε τελείως το i απο την ανάθεση, αλλά ήταν μόνο μια μεταβλητή σε αυτό το παράδειγμα. https://www.mathworks.com/help/matlab/matlab_prog/vectorization.html Με σκέτο το κ όπως προτάθηκε το βγάζει ασπρόμαυρο στο τέλος, περνάει σε όλα τα layers του RGB την ίδια τιμή στην μικρή εικόνα.
Sheogorath Δημοσ. 12 Μαΐου 2017 Μέλος Δημοσ. 12 Μαΐου 2017 Update, το vectorization δεν κατάφερα να το κάνω για αυτές τις loopες, το δοκίμασα σε απλούστερες τουλάχιστον και δουλεύει. Κατήργησα το 2ο dec2bin γιατί δεν το χρειαζόμουν πουθενά και βλακωδώς το έτρεχα για δύο. Ο κώδικας έπεσε στα ~8 δευτερόλεπτα, απο τα ~420 αρχικά! p=0; for i=1:8:s_Mask1 for j=1:s_Mask2 p=p+1; if p>limit break; end for k=1:s_Mask3 str1=dec2bin_2(secret(p,k)); for n=0:7 if (str1(n+1)==1)&&(mod(reference(i+n,j,k),2)==0) reference(i+n,j,k)=reference(i+n,j,k)+1; elseif (str1(n+1)==0)&&(mod(reference(i+n,j,k),2)==1) reference(i+n,j,k)=reference(i+n,j,k)-1; end end end end end Θα δοκιμάσω και το ΧΟR που πρότεινε ο φίλος παραπάνω, μόλις βρω χρόνο. Ευχαριστώ όσους βοηθήσανε, καλή συνέχεια!
Ablaoublas_542 Δημοσ. 17 Μαΐου 2017 Δημοσ. 17 Μαΐου 2017 (επεξεργασμένο) Καλησπέρα σε όλους, Έχω γράψει έναν κώδικα για LSB stenography στο Matlab, αλλά ένα for loop είναι απίστευτα αργό. Με το κλασσικό tic toc είδα ότι παίρνει κάπου 400 δευτερόλεπτα για να τελειώσει, ενώ άλλα με παρομοιο αριθμό επαναλήψεων χρειάζονται μονοψήφιο αριθμό δευτερολέπτων. Το loop είναι το παρακάτω for i=1:8:1080 for j=1:1920 p=p+1; if p>378*679 break; end for k=1:3 str1=dec2bin(secret(p,k),8); for n=0:7 str2=dec2bin(reference(i+n,j,k),8); str2(8)=str1(n+1); reference(i+n,j,k)=bin2dec(str2); end end end end Με την reference να είναι η μεγάλη εικόνα και η secret η 8 φορές μικρότερη που αντικαθιστά το 8ο μπιτ σε κάθε byte της μεγάλης. parloop δεν μπορεί να γίνει γιατί χτυπάει στην γραμμή με την ανάθεση στον πίνακα reference αλλά και προφανώς θα είχε θέμα με την αλλαγή τιμής στο p=p+1. Καμία ιδέα για το τι μπορεί να γίνει, αν μπορεί να γίνει κάτι? Έχω κάνει καμία γερή πατατιά εκεί μέσα? Συναδελφε για δωσε λιγο τα δεδομενα:εχουμε καποιο offset η βαζουμε απο την αρχη της εικονας? Οι εικονες ειναι tiff και τις διαβαζουμε με imread? Edit: Για δες: x=imread('arxikheikona'); y=imread('payload'); [payloadM,payloadN]=size(y); offsetX=0; offsetY=0; subImage=x(1+offsetX:offsetX+payloadM,1+offsetY:offsetY+payloadN); startingLsb=bitget(subImage,1); payloadLsb=bitget(y,1); subImage(find(startingLsb>payloadLsb))=subImage(find(startingLsb>payloadLsb))-1; subImage(find(startingLsb<payloadLsb))=subImage(find(startingLsb<payloadLsb))+1; x(1+offsetX:payloadM,1+offsetY:payloadN)=subImage; %x is the final image %if offsets=0 check this %check=bitget(x(1:payloadM,1:payloadN),1)-bitget(y,1); %find(check) %check should be empty 0 by 1 matrix %time is ~0.04 seconds Επεξ/σία 18 Μαΐου 2017 από Ablaoublas_542 3
ReversedVertigo Δημοσ. 18 Μαΐου 2017 Δημοσ. 18 Μαΐου 2017 Οptimized κωδικας στο Matlab --> vectorization. Αποφευγεις δηλαδη for loops και κανεις τις ιδιες πραξεις με πινακες: array indexing, reshape κλπ Βεβαια οπως βλεπω τον κωδικα σου μαλλον κατι τετοιο δεν ειναι ευκολο η δεν ξερω αν ειναι καν εφικτο
Sheogorath Δημοσ. 18 Μαΐου 2017 Μέλος Δημοσ. 18 Μαΐου 2017 Οptimized κωδικας στο Matlab --> vectorization. Αποφευγεις δηλαδη for loops και κανεις τις ιδιες πραξεις με πινακες: array indexing, reshape κλπ Βεβαια οπως βλεπω τον κωδικα σου μαλλον κατι τετοιο δεν ειναι ευκολο η δεν ξερω αν ειναι καν εφικτο Το έψαξα με το vectorization, αλλά στον δικό μου κώδικα δεν γινόταν εύκολα implement. Πάντως τα 8 δευτερόλεπτα δεν είναι τραγικά. Συναδελφε για δωσε λιγο τα δεδομενα:εχουμε καποιο offset η βαζουμε απο την αρχη της εικονας? Οι εικονες ειναι tiff και τις διαβαζουμε με imread? Edit: Για δες: x=imread('arxikheikona'); y=imread('payload'); [payloadM,payloadN]=size(y); offsetX=0; offsetY=0; subImage=x(1+offsetX:offsetX+payloadM,1+offsetY:offsetY+payloadN); startingLsb=bitget(subImage,1); payloadLsb=bitget(y,1); subImage(find(startingLsb>payloadLsb))=subImage(find(startingLsb>payloadLsb))-1; subImage(find(startingLsb<payloadLsb))=subImage(find(startingLsb<payloadLsb))+1; x(1+offsetX:payloadM,1+offsetY:payloadN)=subImage; %x is the final image %if offsets=0 check this %check=bitget(x(1:payloadM,1:payloadN),1)-bitget(y,1); %find(check) %check should be empty 0 by 1 matrix %time is ~0.04 seconds Θα το δοκιμάσω. Φαίνεται σαφώς πιο matlabίστικος κώδικας απο την "c" μου
Ablaoublas_542 Δημοσ. 18 Μαΐου 2017 Δημοσ. 18 Μαΐου 2017 Το έψαξα με το vectorization, αλλά στον δικό μου κώδικα δεν γινόταν εύκολα implement. Πάντως τα 8 δευτερόλεπτα δεν είναι τραγικά. Θα το δοκιμάσω. Φαίνεται σαφώς πιο matlabίστικος κώδικας απο την "c" μου Παραπανω δεν παει. Πιο σοκολατα γαλακτος δεν γινεται! που ελεγε και μια διαφημιση. Παντως αυτο με το vectorization που ουσιαστικα αυτο εκανα ειναι το σημειο κλειδι, ειχαν πολυ δικιο τα παιδια στο οτι αν ειναι να γραψεις δομημενο προγραμμα καλυτερα να το κανεις σε python, τα array της octave/matlab ειναι πολυ πιο περιπλοκες δομες απο τα κλασσικα array και δεν θα μου εκανε εντυπωση αν υστερουσε το matlab σε ταχυτητα οταν βαζεις for loop στο παιχνιδι. 2
pmav99 Δημοσ. 19 Μαΐου 2017 Δημοσ. 19 Μαΐου 2017 Και σε Python αν θέλεις να γράψεις efficient κώδικα με πίνακες τοτε πάλι vectorization χρησιμοποιείς (numpy). Δεν έχει να κάνει με τη γλώσσα το vectorization 1
ReversedVertigo Δημοσ. 19 Μαΐου 2017 Δημοσ. 19 Μαΐου 2017 Και σε Python αν θέλεις να γράψεις efficient κώδικα με πίνακες τοτε πάλι vectorization χρησιμοποιείς (numpy). Δεν έχει να κάνει με τη γλώσσα το vectorization Nαι αν χρησιμοποιεις Numpy ναι. Το Numpy εχει αρκετες ομοιοτητες με το Matlab Αλλα αν απλα χρησιμοποιεις λιστες πχ τα for loop της ειναι αρκετα optimized
Ablaoublas_542 Δημοσ. 19 Μαΐου 2017 Δημοσ. 19 Μαΐου 2017 Και σε Python αν θέλεις να γράψεις efficient κώδικα με πίνακες τοτε πάλι vectorization χρησιμοποιείς (numpy). Δεν έχει να κάνει με τη γλώσσα το vectorizationΜα το numpy ειναι ενα package που προσφερει ενα array object, υλοποιοντας vectorized δυνατοτητες στην python. Δεν ειπε κανεις οτι εχει κατι μαγικο το matlab, απλα η "κλαση" array εχει υλοποιημενες μεθοδους φιλικες προς το logical indexing κλπ αντι για δομες επαναληψης. Το matlab ως γλωσσα ανωτερου επιπεδου απο την python το εχει αυτο το object ενσωματωμενο, τουτεστην το vectorization ειναι αναποσπαστο κομματι του matlab, ενω για το numoy και την python δεν ισχυει το ιδιο.Τεσπα νομιζω το ιδιο πραγμα θελουμε να πουμε, εδω δεν εχουμε σχολιασει καν ποσο ευαλωτο ειναι το lsb steganography 1
Sheogorath Δημοσ. 19 Μαΐου 2017 Μέλος Δημοσ. 19 Μαΐου 2017 Τεσπα νομιζω το ιδιο πραγμα θελουμε να πουμε, εδω δεν εχουμε σχολιασει καν ποσο ευαλωτο ειναι το lsb steganography Ναι μωρέ, trivial ήτανε. Απλά είναι χρήσιμο για να στέλνεις πράγματα σε κοινή θέα, όταν ο άλλος δεν γνωρίζει ότι πρέπει να ψάξει. Τώρα αν πας σε κλειδιά κτλ κτλ δεν υπάρχει σύγκριση.
Ablaoublas_542 Δημοσ. 20 Μαΐου 2017 Δημοσ. 20 Μαΐου 2017 Ναι μωρέ, trivial ήτανε. Απλά είναι χρήσιμο για να στέλνεις πράγματα σε κοινή θέα, όταν ο άλλος δεν γνωρίζει ότι πρέπει να ψάξει. Τώρα αν πας σε κλειδιά κτλ κτλ δεν υπάρχει σύγκριση. Το ειπα μπας και ξεκινησει συζητηση για τροπους ανιχνευσης.Btw αν το δοκιμασεις πες αν δουλευει, βαριουμουν να το τεσταρω με κανονικες εικονες.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα