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

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

Δημοσ.

Παιδια καλησπερα!

εχω αυτον τον τυπο Zi=(αΖi-1+c)(mod m) και θελω να τον υλοποιησω στο matlab

Εχω γραψει ενα κώδικα αλλα απ οτι φαινεται ειναι λαθος

Εδω:

>z=5;%thetw seed.
n=20000;
i=1;
a=7^10;
c=2^64-3;
m=2^64-1;
u=[];

while i<n
   x(i)=a*z(i-1)+c;
   z(i)=mod(x,m);
   u(i)=z(i)/m;
   i=i+1;
end

 

Οταν το τρεχω στο περιβαλλον matlab μου βγαζει αυτο το μηνυμα:

??? Attempted to access z(0); index must be a

positive integer or logical.

 

Καμμια βοηθεια?

Θενξ εκ των προτερων!

Δημοσ.

Παιδια καλησπερα!

εχω αυτον τον τυπο Zi=(αΖi-1+c)(mod m) και θελω να τον υλοποιησω στο matlab

Εχω γραψει ενα κώδικα αλλα απ οτι φαινεται ειναι λαθος

Εδω:

>z=5;%thetw seed.
n=20000;
i=1;
a=7^10;
c=2^64-3;
m=2^64-1;
u=[];

while i<n
   x(i)=a*z(i-1)+c;
   z(i)=mod(x,m);
   u(i)=z(i)/m;
   i=i+1;
end

 

Οταν το τρεχω στο περιβαλλον matlab μου βγαζει αυτο το μηνυμα:

??? Attempted to access z(0); index must be a

positive integer or logical.

 

Καμμια βοηθεια?

Θενξ εκ των προτερων!

 

Το πρόβλημα υπάρχει στη γραμμή : x(i)=a*z(i-1)+c;

Οι πίνακες στο ματλαμπ αρχίζουν από το 1.

 

και άσε που από τον τύπο, η αφαίρεση από ότι καταλαβαίνω είναι στην τιμή και όχι στον πίνακα δηλαδή,

 

x(i)=a*z(i)-1+c;

Δημοσ.

Φιλε σ ευχαριστω πολυ για την απαντηση. Τωρα που το ξανασκεφτομαι ισως βαλω while<=n+1 και να ξεκινησω απ το i=2.

 

Στον τυπο, ασχετα που δεν φαινεται καλα εδω, το i-1 ειναι δεικτης του Z γι αυτο το εβαλα Ζ(i-1)

 

Ευχαριστω παντως για τη βοηθεια :)

Δημοσ.

Παιδια καλησπερα!

εχω αυτον τον τυπο Zi=(αΖi-1+c)(mod m) και θελω να τον υλοποιησω στο matlab

Εχω γραψει ενα κώδικα αλλα απ οτι φαινεται ειναι λαθος

Εδω:

>z=5;%thetw seed.
n=20000;
i=1;
a=7^10;
c=2^64-3;
m=2^64-1;
u=[];

while i<n
   x(i)=a*z(i-1)+c;
   z(i)=mod(x,m);
   u(i)=z(i)/m;
   i=i+1;
end

 

Οταν το τρεχω στο περιβαλλον matlab μου βγαζει αυτο το μηνυμα:

??? Attempted to access z(0); index must be a

positive integer or logical.

 

Καμμια βοηθεια?

Θενξ εκ των προτερων!

 

Ο κώδικας είναι λάθος.

 

Καταρχάς, φτιάχνεις ένα πίνακα, τον x, που τον αυξάνεις συνέχεια χωρίς να σου χρειάζεται.

Ακόμα, σαν z(i), θα παίρνεις το mod(m) για όλον τον x που έχεις φτιάξει μέχρι τότε.

 

Αυτό σημαίνει ότι στην δεύτερη loop θα έχεις λάθος κάτι σαν matrix index dimensions must agree ή mismatch.

 

Επίσης, ΔΕΝ χρησιμοποιείς τα ωραία features του MATLAB!.

 

Ακόμα, η χρήση που κάνεις στο z και στον u ΣΙΓΟΥΡΑ σου βγάζει το warning για αλλαγή διαστάσεων και ΣΙΓΟΥΡΑ σου λέει "consider preallocation for speed".

 

 

Καλύτερα είναι να γράψεις:

 

>
firstElement = 5;
numberOfElements = 2*10e+004;
Z = [firstElement zeros(1, numberOfElements - 1)];
a = 7^10;
c = 2^64-3;
m = 2^64-1;

for index = 2:length(Z)
 Z(index) = mod((a*Z(index-1) + c), m);
end

u = Z./m;

Δημοσ.

Ευχαριστω πολυ φιλε Timonkaipumpa

 

Η αληθεια ειναι οτι σε ματλαμπ ειμαι ασχετος (εδω και 4 μερες προσπαθω να μαθω καποια βασικα) και εχω εργασια να παραδοσω.

 

Θα μελετησω το κωδικα που εβαλες

 

Θενξ again

 

 

Edit:

 

φιλε timonkaipoumpa, για να καταλαβω

το Ζ=[firstElement zeros(1, numberOfElements - 1)], σημαινει οτι το Ζ ειναι ενας πινακας με διαστασεις το firstElement (ή αλλιως το seed) και τον πινακα zeros? Ή το εχω καταλαβει λαθος? Σορρυ για την "noob-άδικη" ερωτηση.

 

Επισης, το firstElement ειναι το seed ή αλλιως ο σπορος ενω το index παιζει το ρολο του i που ειχα βαλει εγω? Δεν χρειαζεται να δώσσουμε τιμη στο index, πχ 2, πρωτου το χρησιμοποιησουμε στο loop?

Δημοσ.

Edit:

 

φιλε timonkaipoumpa, για να καταλαβω

το Ζ=[firstElement zeros(1, numberOfElements - 1)], σημαινει οτι το Ζ ειναι ενας πινακας με διαστασεις το firstElement (ή αλλιως το seed) και τον πινακα zeros? Ή το εχω καταλαβει λαθος? Σορρυ για την "noob-άδικη" ερωτηση.

 

Επισης, το firstElement ειναι το seed ή αλλιως ο σπορος ενω το index παιζει το ρολο του i που ειχα βαλει εγω? Δεν χρειαζεται να δώσσουμε τιμη στο index, πχ 2, πρωτου το χρησιμοποιησουμε στο loop?

 

 

Το

 

>
Ζ=[firstElement zeros(1, numberOfElements - 1)]

 

Σημαίνει ότι ο Ζ αποτελείται από την τιμή firstElement και μία σειρά (numberOfElements - 1) μηδενικών.

 

Δοκίμασε να το κάνεις με μικρότερες διαστάσεις στο command window να το δεις κιόλας.

 

Στο MATLAB δεν δηλώνεις διαστάσεις σε απλούς πίνακες. Δεν είναι σαν την C που πρέπει να δηλώσεις διαστάσεις.

 

Στο MATLAB τα πάντα είναι πίνακες. Ακόμα και το

 

>
a = 5

 

είναι ένας πίνακας με ένα στοιχείο.

 

Αν μετά κάνεις

 

>
a(10) = 100

 

Τότε στο a θα προστεθούν στοιχεία μέχρι να έχει συνολικά 10 στοιχεία και το 10ο θα γίνει ίσο με 100.

 

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

 

Για αυτό, στον Z έβαλα το πρώτο στοιχείο (firstElement ή seed όπως το είχες εσύ) και τον γέμισα μετά με όσα μηδενικά θα είναι και τα τελικά του στοιχεία, δηλαδή numberOfElements - 1 (-1 γιατί ήδη έχει μπει ένα στοιχείο, το firstElement).

 

 

Ναι, το firstElement = seed και το index = i.

 

Όχι, δεν χρειάζεται να δώσεις τιμή. Γενικά το for στο MATLAB είναι αρκετά ευέλικτο. Μπορείς να δηλώσεις ακόμα και:

 

>
a = [1 2 3; 4 5 6; 7 8 9];

for i = a
% Do something
end

 

Και θα έχεις σαν indexes στοιχεία του πίνακα a σε κάθε loop.

Δημοσ.

Φιλε timonkaipoumpa να σαι καλα

Σ ευχαριστω και για την εξηγηση :rolleyes:

 

Θα προσπαθησω τωρα να λυσω την ασκηση γιατι έχει κι αλλα ζητουμενα (που μόνο ευκολα δεν ειναι για μενα)

Δημοσ.

Ό,τι θες να κάνεις με MATLAB μπορείς να το ρωτήσεις πώς γίνεται.

 

Για να το κάνεις αυτό γράφεις:

 

>
lookfor 'i erwtisi soy'

 

Θα περιμένεις λίγο ή λίγο πιο πολύ, αναλόγως με το σύστημά σου, και θα σου βγάλει μία λίστα από εντολές.

 

Για να δεις πώς χρησιμοποιείται η κάθε εντολή γράφεις:

 

>
help iEntoli

 

Στο αποτέλεσμα του help, κάτω κάτω, έχει ένα hyperlink που, κατά 80%, λέγεται

 

>
doc iEntoli

 

Πάτα το και θα σε βγάλει στο help browser του MATLAB όπου έχει παραδείγματα και αναλυτική εξήγηση της εντολής.

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

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

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

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

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

Σύνδεση

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

Συνδεθείτε τώρα
  • Δημιουργία νέου...