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

Matlab - Πίνακες-ερωτήσεις


zaxoys

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

Δημοσ.

Το πρόβλημα είναι το εξής: (είναι σαν CA αν έχει ασχοληθεί κανείς)

Έστω ένας πίνακας 50Χ50 (στην ουσία είναι ένα grid ) οπού το πάνω μέρος πχ 30Χ50 είναι 0 Α1=(zeros(30,50)

και ο υπόλοιπος έχει κάποιες τιμές (έστω πχ Α2=rand(20,50).Οπότε Α=[A1;A2]

 

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

>0.5 σε κάποιο σημείο,η διαφορά αυτή (ΤΙΜΗ-0.5) να μεταφέρεται

1.σε κάποιο γειτονικό σημείο από τα 8 αν κάποιο από αυτά έχει τιμή 0

ή αλλιώς

2) σε κάποιο άλλο γειτονικό που έχει κάποια άλλη τιμή οπότε αν έχει τιμη >0.5 πάλι μεταφέρεται κλπ

 

 

Το πρόβλημα που αντιμετωπίζω είναι οτι προφανώς πχ στο #1 μπορεί να υπάρχουν 3 πιθανά σημεία (0) γύρω από αυτό που έχω και εγώ θέλω να μεταφερθεί τυχαία (ισοπίθανα δλδ σε οποιαδήποτε σημείο ) η τιμή σε κάποιο από αυτά ,έχει κανείς κάποια ιδεά πως μπορεί να γίνει αυτό?

 

επίσης μήπως ξέρει κανείς πως μπορώ να απεικονίσω αυτόν τον πίνακα σαν εικόνα?Μια απόπειρα που έκανα με την imhshow μου την βγάζει πολύ μικρή αφού θεωρεί το κάθε σημείο του grid σαν pixel

Δημοσ.

Για το πρωτο προβλημα που αναφερεις μια λυση ειναι να περνας τον αριθμο των μηδενικων στοιχειων γυρω απο το ζητουμενο σε μια temp μεταβλητη και στη συνεχεια να χρησιμοποιεις την εντολη randint για να παρεις τυχαια ενα απο τα σημεια και να τοποθετησεις εκει την τιμη που θες.

 

Εστω δλδ οπως λες οτι για το στοιχειο #1 εχεις τρια μηδενικα. Βαζεις σε μια μεταβλητη tmp = 3. Μετα διαλεγεις τυχαια με κανονικη κατανομη ενα απο τα στοιχεια αυτα ως εξης pos = randint(1,1,[1,3]). Και στη θεση που θα προκυψει βαζεις την τιμη της μεταβλητης.

 

Οσο για το imshow ετσι λειτουργει. Το καθε στοιχειο του array γινεται ενα pixel. Για να δεις μια εικονα δουλευει καλυτερα το imshow(uint8(my_image))

 

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

Δημοσ.

Το προβλημα που βλεπω να δημιουργειται ειναι να βρεις εναν τροπο να ξεπερασεις το προβλημα με τις οριακες συνθηκες. Δλδ ο αριθμος των γειτονικων στοιχειων διαφοροποιειται αναλογα με τη θεση του στοιχειου που εξεταζεις, απο 3 εως 8 στοιχεια.

Δημοσ.

Ριξε μια ματια σε αυτο. Δουλευει μονο για το στοιχειο (1,1). Με καταλληλες τροποποιησεις μπορεις να το κανεις και για τα υπολοιπα στοιχεια. Δεν μπορω να σκεφτω κατι διαφορετικο απο το να πρεπει να παρεις 8 διαφορετικες περιπτωσεις αναλογα με το ποιο ειναι το στοιχειο που θες να εξετασεις.

 

Για καποιο λογο που δεν καταλαβαινω τωρα δεν δουλευει με το if i ~= 2 && j ~= 2. Αυτο το εβαλα για να μην μετραει ως μηδενικο το προς εξεταση στοιχειο σε περιπτωση που αυτο ισουται με 0.

 

>
clear all
clc

a = [1 0;0 0]
b = [NaN NaN NaN;NaN NaN NaN;NaN NaN NaN]

if size(a,1) == 2 && size(a,2) == 2
   b(2:3,2:3) = a;


   cnt = 0;
   for i = 1:size(b,1)
       for j = 1:size(b,2)
%             if i ~= 2 && j ~= 2
               if b(i,j) == 0
                   cnt = cnt + 1;
               end
%             end
       end
   end
   cnt

   pos = randint(1,1,[1,cnt])

   cnt2 = 0;
   for i = 1:size(b,1)
       for j = 1:size(b,2)
%             if i ~= 2 && j ~= 2
               if b(i,j) == 0
                   cnt2 = cnt2 + 1;
                   if cnt2 == pos
                       ipos = i;
                       jpos = j;
                       break
                   end
               end
%             end
       end
   end
   cnt2
   
   b(ipos,jpos) = b(2,2);
   b

   a = b(2:3,2:3);
   a
end

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

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

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