WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Matrix nach geraden, ungeraden Elementen durchsuchen

 

upt0zer0
Forum-Century

Forum-Century


Beiträge: 107
Anmeldedatum: 10.07.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.11.2013, 19:19     Titel: Matrix nach geraden, ungeraden Elementen durchsuchen
  Antworten mit Zitat      
Hey

ich habe eine Matrix, die theoretisch jede Zahl enthalten kann.

Jetzt soll folgendes getan werden:

nehme Matrix A
durchsuche Matrix A nach Spalten und Zeilen
findest du eine gerade Zahl -> schreibe 0
findest du eine ungerade Zahl -> schreibe 1

irgendwie find ich hierfür keinerlei Befehle...
Private Nachricht senden Benutzer-Profile anzeigen


denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 28.11.2013, 19:36     Titel:
  Antworten mit Zitat      
Hallo

das wird durch Modulo gemacht, Befehl heißt MOD

Code:
Private Nachricht senden Benutzer-Profile anzeigen
 
upt0zer0
Themenstarter

Forum-Century

Forum-Century


Beiträge: 107
Anmeldedatum: 10.07.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.11.2013, 21:09     Titel:
  Antworten mit Zitat      
Okay, ich habe folgendes vor:

Wenn ich Matrizen multipliziere, können ja alle möglichen Zahlen rauskommen: 0,1,2,...

Wenn ich dagegen binär addiere, gilt:
0+0 = 0;
1+0 = 1;
0+1 = 1;
1+1 = 0;

folglich kann ich eine normale Multiplikation einfach zu einer binären machen, indem ich alle geraden Elemente suche, und diese zu Null setze und alle ungeraden Elemente suche, und diese zu eins setzen.

also z.B.:

0 3 2
1 3 4

wird zu

0 1 0
1 1 0

Folglich hab ich folgenden Code geschrieben:

Code:

for i=1:zeilen
        for j=1:spalten
            if (A2(i,j) == 0)
                A2(i,j) = 0;
            elseif (A2(i,j) ~= 0)
                if mod(A2(i,j),2) ~= 0
                    A2(i,j) = 1;
                elseif mod(A2(i,j),2) == 0
                    A2(i,j) = 0;
                end
            end
        end
    end
 


Wobei A meine ursprüngliche Matrix ist und mit dem size Befehl bstimmt wurde, wieviele spalten und zeilen es gibt.

Code läuft auch, nur macht er das nicht so wie ich das will. Jemand irgendein Plan wo mein Denkfehler sen könnte?
Private Nachricht senden Benutzer-Profile anzeigen
 
Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 28.11.2013, 21:36     Titel:
  Antworten mit Zitat      
Hallo,

hast du den Beitrag über deinem gut gelesen? Gerade Zahlen zu 0 und ungerade Zahlen zu 1 zu machen, geht mit dem mod-Befehl ohne Schleifen und if's:

Code:


Im Übrigen ist dein Code auch nicht besonders sinnvoll, beispielsweise
Code:
if (A2(i,j) == 0)
                A2(i,j) = 0;


Wenn A2 in der Zeile i und Spalte j den Eintrag 0 hat, dann setz den Eintrag an der Stelle auf 0. Das bringt nichts, da an der Stelle ohnehin bereits eine 0 stand.

Weiteres Beispiel:
Code:

 if mod(A2(i,j),2) ~= 0
                    A2(i,j) = 1;


mod(...,2) hat für natürliche Zahlen nur die Ausgaben 0 und 1. Das heißt, wenn das Ergebnis ungleich 0 ist, dann ist es zwangsläufig bereits 1. Da muss man dann auch nicht mehr eine 1 hinsetzen, denn da war bereits eine.

Viele Grüße,
Nras.
Private Nachricht senden Benutzer-Profile anzeigen
 
upt0zer0
Themenstarter

Forum-Century

Forum-Century


Beiträge: 107
Anmeldedatum: 10.07.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.11.2013, 22:05     Titel:
  Antworten mit Zitat      
Okay, dann hab ich den Befehl grundsötzlich falsch verstanden. Interessant.

Ok, mein Ziel jetzt: wenn ich die Matrix in den 1,0-Stil konvertiert hab, mit Hilfe des mod-Befehls, soll die Matrix so oft mit der Ursprungsmatrix multipliziert werden und dann mit der Ursprungsmatrix verglichen werden (hier isequal Befehl) bis sie gleich sind.

Beispiel:

A=[0,1,1;1,0,0;0,0,0]
dann ist ja
A²=[1,0,0;0,1,1;0,0,0]
und wiederum
A³=A.

Hab also ne While Schleife gemacht, die solange laufen soll, bis isequal erfüllt ist. eine Variable n soll mitzählen, bei welcher Potenz ich bin.

Mein Code hierzu:

Code:

A2 = A;
n = 1;                  
k = 1;                  

while k == 1;            

    A2 = A2*A;

    A2 = mod(A2,2);

    if (isequal(A,A2))==1    
        k = 2;              
    end
 
    n = n+1;            
   
end
Private Nachricht senden Benutzer-Profile anzeigen
 
Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 29.11.2013, 10:47     Titel:
  Antworten mit Zitat      
Hallo,

und wo ist daran deine Frage? Das scheint doch für das Beispiel gut zu funktionieren.

Übrigens liefert isequal() eine 1 oder eine 0. Das heißt true (sind gleich) oder false (sind nicht gleich).
isequal(A,A2)==1 ist dann wieder doppelt gemoppelt, da kann man sich das ==1 auch sparen. Wie auch immer, manche finden das lesbarer.

Ich weiß nicht, ob das für jede Matrix klappt. Wenn das mal nicht klappt, dann sitzt du in einer Endlosschleife. Ein Ausweg wäre es zum Beispiel eine maximale Iterationsanzahl festzulegen, nach der abgebrochen wird. Z.B. so.

Code:
nmax = 1000;
while k == 1;            
    A2 = A2*A;
    A2 = mod(A2,2);
    if (isequal(A,A2))==1    
        k = 2;              
    end
    n = n+1;
   
    % Endlosschleife vermeiden
    if n > nmax
        k = 2;
        n = -1; % zum Beispiel als Fehlerwert
    end  
end
 

Das bricht dann nach 1000 Versuchen ab und liefert für n -1 zurück. Oder NaN wäre denkbar.
Private Nachricht senden Benutzer-Profile anzeigen
Verschoben: 29.11.2013, 12:03 Uhr von denny
Von Matlab intern nach Programmierung
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.