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

ερωτηση σε matlab


stefanos59

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

Δημοσ.

Γεια σας επειδη εχει κολλησει το μυαλο μου θα ηθελα να ρωτησω κατι.

Οταν θελουμε να σχεδιασουμε ενα τετραγωνικο παλμο με περιοδο Τ

θα βαλω σε ενα διανυσμα Τ=[::] και μετα θα κανω square(T),

αν ομως αυτος ο παλμος διαρκει π.χ 2*Τ

πως θα το κανω αυτο?

θα το βαλω μεσα στην square?

Ευχαριστω εκ των προτερων!!

Δημοσ.

οκ,

ΤΗΑΝΚS

 

---------- Προσθήκη στις 19:27 ---------- Προηγούμενο μήνυμα στις 16:07 ----------

 

Να ρωτησω το παρακατω ειναι λαθος?

>dt=0.001;
T1=5/4;
t1=T1/2;

%sxediasmos tou tetragwnikou palmou
%to x einai periodiko me T1 enos tetragwnikou palmou diarkeia t1(1,12)



for i=1:dt:12
  for j=1:10
     if i>1 && i<1+j*t1
         x=1;
     else i>1+t1*j && i<T1*j+1
          x=0;
         end
  end
end   

plot(x); 

Δημοσ.

Το είδες το link που έδωσα; Υπάρχει η square και αυτό που θες να κάνεις είναι 3 γραμμές κώδικα! Δεν υπάρχει λόγος να το κάνεις με if-clauses και for-loops, άσε που στο MATLAB αυτά πρέπει να αποφεύγονται όταν είναι δυνατό. Δεν γράφεις C, το MATLAB έχει άλλη φιλοσοφία.

Δημοσ.

Ναι το ειδα,απλα ηθελα να προσπαθησω να το κανω και ετσι για να το κατανοησω καλυτερα...

Δοκιμασα και με ones() και zeros(),αλλα κολλαω στα διαστηματα..

Δημοσ.
Ναι το ειδα,απλα ηθελα να προσπαθησω να το κανω και ετσι για να το κατανοησω καλυτερα...

Δοκιμασα και με ones() και zeros(),αλλα κολλαω στα διαστηματα..

 

Ναι αυτό σου λέω, ΔΕΝ πρέπει να το κάνεις έτσι στο MATLAB. Ο κώδικας που "κρύβεται" πίσω από την εντολή square είναι διαθέσιμος και μπορείς να τον δεις (>> edit square) για να το κατανοήσεις καλύτερα.

Δημοσ.

Να ρωτησω για το σχεδιασμο του παρακατω σηματος στην matab ο κωδικας που ακολουθει ειναι σωστος?

 

X(t)=0.6*t για 0<=t<=1

X(t)=-0.6*t+1 για 1<t<=2

X(t)=0.6 για 2<t<=4

>for i=0:1
X(i)=0.6*i;
end
for i=1:2
X(i)=-0.6*i+1;
end
for i=2:4
X(i)=0.6;
end
plot(X);

Δημοσ.

άντε πάλι...σου εξήγησα ότι δεν πρέπει χρησιμοποιήσεις for και if εντολές και ότι ο κώδικας είναι 3-4 γραμμές! Κάνεις post έναν κώδικα που είναι ΠΑΝΤΟΥ λάθος και ρωτάς αν είναι σωστός; Ε, δε βλέπεις όταν το τρέχεις ότι κοκκινίζει όλο το workspace από τα λάθη; Κάτσε διάβασε λίγο τη γλώσσα που προσπαθείς να χρησιμοποιήσεις. Το index στους πίνακες ξεκινάει από το 1 και όχι από το 0 !

 

ΔΕΝ χρειάζονται τα for-loops, διότι η φιλοσοφία του MATLAB είναι ότι όλα είναι πίνακες! ΔΕΝ γράφεις όπως στη C.

 

παράδειγμα στον κώδικά σου (που είναι λάθος έτσι και αλλιώς!):

 

for i=1:2

X(i)=-0.6*i+1;

end

 

μπορεί να γίνει:

 

i=[1 2];

X=-0.6*i+1;

Δημοσ.

Για να καταλάβεις τη σημασία αυτού που αναφέρει ο Dr. Fuzzy, δοκίμασε το παρακάτω. Η πρώτη στήλη στον h είναι ο χρόνος χωρίς το loop και η δεύτερη με χρήση for.

 

Το 1ο είναι περίπου 700 φορές γρηγορότερο, τουλάχιστον στον N280 του asus μου, κοίτα το figure.

 

>
clear

for j=1:100
   
tic
   i=1:1:10^4;
   X=-0.6*i+1;
h(j,1)=toc;

tic 
   for i=1:1:10^4
       Y(i)=-0.6*i+1;
   end 
h(j,2)=toc;
clear 'X' 'Y'
end

figure, plot(h(:,2)./h(:,1)), ylabel('Ratio of processing time (Mat/Loop)'), xlabel('Nr of Repetition')

mean(h(:,2)./h(:,1) )

Δημοσ.

Οντως ναι..

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

>t=[0:0,001:4];
i=[0 1];
X=0.6*i;
i1=[1 2];
X=-0.6*i1+1;
i2=[2 3 4]
X=0.6;%τετραγωνικος παλμος στο διαστημα i2
plot(X);

Δημοσ.
Οντως ναι..

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

>t=[0:0,001:4];
i=[0 1];
X=0.6*i;
i1=[1 2];
X=-0.6*i1+1;
i2=[2 3 4]
X=0.6;%τετραγωνικος παλμος στο διαστημα i2
plot(X);

 

 

Όταν του λες plot... το MATLAB σχεδιάζει τιμές. Εάν έχεις ΜΙΑ τιμή, θα κάνει μία τελίτσα, που είναι αρκετά δύσκολο να την δεις εάν δεν είσαι υποψιασμένος.

Εσύ στην μεταβλητή X έχεις ΜΟΝΟ μία τιμή λόγω της προτελευταίας γραμμής.

 

Άρα, ένας 1x1 πίνακας στην plot είναι μία τελίτσα... και συγκεκριμένα αυτή είναι στο 1,0.6

 

Γιατί δεν χρησιμοποιείς την square που σου είπαν; Γράψε help square και θα έχεις όλη την εξήγηση του πώς λειτουργεί.

 

Επίσης, θα σου πρότεινα να λειτουργείς με μεταβλητές αντί για απόλυτα νούμερα... κάλλιστα μπορείς να χρησιμοποιήσεις μία μεταβλητή ονόματος Fs αντί για απόλυτο βήμα στον vector σου (αντί για t=0:0.004:1 μπορείς να βάλεις t=0:1/Fs:1 ή t = 0:T:1 όπου Fs η sampling freq και Τ η περίοδος).

 

Έτσι έχεις καλύτερο έλεγχο του τι κάνεις και τι συμβαίνει.

 

 

edit

Αυτό που θες να κάνεις.. μπορεί να γίνει με την square (όπως ΗΔΗ σου είπαν) και με την διαχείριση των στοιχείων του σήματος.

Έτσι, εάν φτιάξεις το σήμα σου X = square(w.*t) (όπου w = 2*pi*f και t = 0:1/Fs:1) μπορείς μετά να κάνεις...

X(startPoint:endPoint) = X(1:firstEndPoint).*desiredValue;

 

Όπου startPoint είναι το σημείο που θες να αρχίσεις την αλλαγή και endPoint είναι το σημείο που θες να τελειώσεις την αλλαγή. desiredValue είναι η τιμή κέρδους που θες να εφαρμόσεις.

 

Εάν έχεις τα σημεία για τις αλλαγές σε χρόνο (π.χ. sec) αντί για δείγματα, τότε μπορείς να βρεις τα δείγματα ως εξής:

startPoint = Fs*startPointTime;

endPoint = Fs*endPointTime;

 

Και είσαι ΟΚ.

Δημοσ.

Απλα ηθελα να δοκιμασω και χωρις την ετοιμη συναρτηση..

τελικα το εκανα και με την συναρτηση και χωρις...

ευχαριστω!!!

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

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