Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

@Sheogorath
To reference(i+n,j,k) τρώει χρόνο για να υπολογίσει δείκτες. Δες πόσες φορές το έχεις δεξιά του ίσον. Χρειάζεται μια φορά για να πάρεις την τιμή και μια φορά αριστερά του = (στην εκχώρηση) για να βάλεις τιμή. Τις άλλες φορές το έχεις σε μεταβλητή. Για να το καταλάβεις: ένα b θέλει χρόνο για να διαβαστεί, φαντάσου τα i,n,j,k και το reference (5 δηλαδή) επί 3 φορές που τα χρησιμοποιείς το μέγιστο (αποτυχία του πρώτου if, επιτυχία του δεύτερου και χρήση πάλι για να αφαιρεσεις 1, μιλάμε για 15 χρόνους ας πούμε ισοδύναμους με 3 του b, και βάλε μια ακόμα για την εκχώρηση, άρα 4 για το b. Η αναλογία, χονδρικά είναι 15/4, περίπου δηλαδή τέσσερις φορές πιο αργός ο κώδικας αν δεν χρησιμοποιήσεις μεταβλητή.

  • Like 1
  • Απαντ. 30
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Συχνή συμμετοχή στο θέμα

Δημοσιευμένες Εικόνες

Δημοσ.

@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, και θα επανέλθω!

Δημοσ.

 

Για παράδειγμα, δοκίμασε να διώξεις το 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

Ναι, έπεσε σε δυόμιση δευτερόλεπτα.

 

Υποκλίνομαι.

39970982.jpg

  • Like 1
Δημοσ.

Διώξε αν θες και τα άλλα 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 την ίδια τιμή στην μικρή εικόνα.
Δημοσ.

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 που πρότεινε ο φίλος παραπάνω, μόλις βρω χρόνο.
 
Ευχαριστώ όσους βοηθήσανε, καλή συνέχεια!
Δημοσ. (επεξεργασμένο)

Καλησπέρα σε όλους,

 

Έχω γράψει έναν κώδικα για 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
Επεξ/σία από Ablaoublas_542
  • Like 3
Δημοσ.

Οptimized κωδικας στο Matlab --> vectorization. Αποφευγεις δηλαδη for loops και κανεις τις ιδιες πραξεις με πινακες: array indexing, reshape κλπ

 

Βεβαια οπως βλεπω τον κωδικα σου μαλλον κατι τετοιο δεν ειναι ευκολο η δεν ξερω αν ειναι καν εφικτο

Δημοσ.

Ο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" μου :P

Δημοσ.

Το έψαξα με το vectorization, αλλά στον δικό μου κώδικα δεν γινόταν εύκολα implement. Πάντως τα 8 δευτερόλεπτα δεν είναι τραγικά.

 

Θα το δοκιμάσω. Φαίνεται σαφώς πιο matlabίστικος κώδικας απο την "c" μου :P

Παραπανω δεν παει. Πιο σοκολατα γαλακτος δεν γινεται! που ελεγε και μια διαφημιση.

Παντως αυτο με το vectorization που ουσιαστικα αυτο εκανα ειναι το σημειο κλειδι, ειχαν πολυ δικιο τα παιδια στο οτι

αν ειναι να γραψεις δομημενο προγραμμα καλυτερα να το κανεις σε python, τα array της octave/matlab ειναι πολυ πιο περιπλοκες δομες απο τα κλασσικα array και δεν θα μου εκανε εντυπωση αν υστερουσε το matlab σε ταχυτητα οταν βαζεις for loop στο παιχνιδι.

  • Like 2
Δημοσ.

Και σε Python αν θέλεις να γράψεις efficient κώδικα με πίνακες τοτε πάλι vectorization χρησιμοποιείς (numpy). Δεν έχει να κάνει με τη γλώσσα το vectorization

  • Like 1
Δημοσ.

Και σε Python αν θέλεις να γράψεις efficient κώδικα με πίνακες τοτε πάλι vectorization χρησιμοποιείς (numpy). Δεν έχει να κάνει με τη γλώσσα το vectorization

 

Nαι αν χρησιμοποιεις Numpy ναι. Το Numpy εχει αρκετες ομοιοτητες με το Matlab

Αλλα αν απλα χρησιμοποιεις λιστες πχ τα for loop της ειναι αρκετα optimized

Δημοσ.

Και σε Python αν θέλεις να γράψεις efficient κώδικα με πίνακες τοτε πάλι vectorization χρησιμοποιείς (numpy). Δεν έχει να κάνει με τη γλώσσα το vectorization

Μα το numpy ειναι ενα package που προσφερει ενα array object, υλοποιοντας vectorized δυνατοτητες στην python. Δεν ειπε κανεις οτι εχει κατι μαγικο το matlab, απλα η "κλαση" array εχει υλοποιημενες μεθοδους φιλικες προς το logical indexing κλπ αντι για δομες επαναληψης. Το matlab ως γλωσσα ανωτερου επιπεδου απο την python το εχει αυτο το object ενσωματωμενο, τουτεστην το vectorization ειναι αναποσπαστο κομματι του matlab, ενω για το numoy και την python δεν ισχυει το ιδιο.

Τεσπα νομιζω το ιδιο πραγμα θελουμε να πουμε, εδω δεν εχουμε σχολιασει καν ποσο ευαλωτο ειναι το lsb steganography :P

  • Like 1
Δημοσ.

Τεσπα νομιζω το ιδιο πραγμα θελουμε να πουμε, εδω δεν εχουμε σχολιασει καν ποσο ευαλωτο ειναι το lsb steganography :P

Ναι μωρέ, trivial ήτανε.

 

Απλά είναι χρήσιμο για να στέλνεις πράγματα σε κοινή θέα, όταν ο άλλος δεν γνωρίζει ότι πρέπει να ψάξει. Τώρα αν πας σε κλειδιά κτλ κτλ δεν υπάρχει σύγκριση.

Δημοσ.

Ναι μωρέ, trivial ήτανε.

 

Απλά είναι χρήσιμο για να στέλνεις πράγματα σε κοινή θέα, όταν ο άλλος δεν γνωρίζει ότι πρέπει να ψάξει. Τώρα αν πας σε κλειδιά κτλ κτλ δεν υπάρχει σύγκριση.

Το ειπα μπας και ξεκινησει συζητηση για τροπους ανιχνευσης.

Btw αν το δοκιμασεις πες αν δουλευει, βαριουμουν να το τεσταρω με κανονικες εικονες.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα

  • Δημιουργία νέου...