|
|
Mithilfe einer function neue Matrix erstellen |
|
dair |

Forum-Newbie
|
 |
Beiträge: 6
|
 |
|
 |
Anmeldedatum: 01.06.15
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 01.06.2015, 01:14
Titel: Mithilfe einer function neue Matrix erstellen
|
 |
Hallo zusammen,
ich habe noch nicht so viel Ahnung vom function schreiben. Hier mal mein Problem:
Das Ziel ist eine function f zu schreiben, die für irgendeine Matrix A eine neue Matrix B ausgibt, die die gleiche Größe wie A hat. Allerdings soll die neue Matrix B nur aus 1, -1 und 0 bestehen. Nach folgenden Regeln:
Für die natürlichen Zahlen in der Matrix A soll in B eine 1 erscheinen, für die negativen eine -1 und für nicht ganzzahlige oder 0 eine 0.
Ich habe mir dazu folgendes überlegt:
Das funktioniert jedoch leider nicht so wie es soll. Die nicht ganzzahligen Zahlen wollte ich mit mod lösen, wenn ich das einbaue bekomme ich aber nur noch Error.
Ich hoffe ihr könnt mir helfen.
|
|
|
|
|
Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 01.06.2015, 02:57
Titel: Re: Mithilfe einer function neue Matrix erstellen
|
 |
Hallo dair,
Herzlich willkommen im Forum!
Wann immer Du im Forum erklärst, dass Du etwas bestimmtes versucht hast, poste den Code. Und wenn Du eine Fehlermeldunge erhälst, poste sie vollständig. Man kann kaum einen Verbesserungsvorschlag machen, wenn man weder den Code noch die Meldung kennt.
Aber etwas vom Code hast Du ja gezeigt.
Hier sind die IF-Befehle ein Problem. Die benötigen ja eine skalare Bedingung. Da "A>0" aber eine Matrix ist, wird intern ein ALL() hinzugefügt. Das macht aber sicher nicht das, was Du möchtest. Um B elementweise änern zu können, benötigst Du entweder (eine oder zwei) Schleifen, oder "logical indices".
Gruß, Jan
|
|
|
dair |
Themenstarter

Forum-Newbie
|
 |
Beiträge: 6
|
 |
|
 |
Anmeldedatum: 01.06.15
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 02.06.2015, 01:15
Titel:
|
 |
Hi Jan,
danke für deine Antwort. Ich habe jetzt mit den logical indicies etwas gearbeitet und das Ergebnis ist doch gleich viel besser:
Damit wird die neue Matrix in gleicher Größe und mit den richtigen Werten ausgegeben. Zwei Dinge fehlen allerdings noch. Zum einen, wie kann ich die ans Ausgabe unterdrücken, also so das nur B=... angezeigt wird.
Und zum anderen was muss ich jetzt noch machen damit für nicht ganzzahlige Zahlen auch eine 0 ausgegeben wird.
Versucht habe ich zum zweiten Punkt folgendes:
Das ändert aber genau gar nichts. Ich nehme mal, weil die > und < Attribute den round Befehl überschreiben. Wie muss ich das ändern?
|
|
|
Winkow |

Moderator
|
 |
Beiträge: 3.842
|
 |
|
 |
Anmeldedatum: 04.11.11
|
 |
|
 |
Wohnort: Dresden
|
 |
|
 |
Version: R2014a 2015a
|
 |
|
|
 |
|
Verfasst am: 02.06.2015, 01:43
Titel:
|
 |
Zitat: |
Zum einen, wie kann ich die ans Ausgabe unterdrücken |
das semikolon am ende unterdrückt die ausgabe ans command window.
Zitat: |
Das ändert aber genau gar nichts. |
was soll die zeile
auch machen? du weist ja nix zu
_________________
richtig Fragen
|
|
|
dair |
Themenstarter

Forum-Newbie
|
 |
Beiträge: 6
|
 |
|
 |
Anmeldedatum: 01.06.15
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 02.06.2015, 17:25
Titel:
|
 |
Das Semikolon hinter dem B verhindert nur, dass B nicht mehr angezeigt wird. Eine ans Ausgabe erfolgt trotzdem. Oder wo meinst du sollte noch ein Semikolon hin?
Die Zeile soll für die nicht ganzzahligen Zahlen eine 0 ausgeben. Ich habe deswegen nichts weiter zugewiesen, weil diese round Zeile normalerweise, ohne andere Argumente, ja genau das macht. Nur in diesem Zusammenhang funktioniert das nicht.
Was müsste ich denn noch hinzuweisen oder ändern?
|
|
|
Winkow |

Moderator
|
 |
Beiträge: 3.842
|
 |
|
 |
Anmeldedatum: 04.11.11
|
 |
|
 |
Wohnort: Dresden
|
 |
|
 |
Version: R2014a 2015a
|
 |
|
|
 |
|
Verfasst am: 02.06.2015, 17:33
Titel:
|
 |
|
 |
|
Zitat: |
Die Zeile soll für die nicht ganzzahligen Zahlen eine 0 ausgeben. Ich habe deswegen nichts weiter zugewiesen, weil diese round Zeile normalerweise, ohne andere Argumente, ja genau das macht. |
hmm nein diese zeile ruft alle argumente von B auf an dessen stelle A eine ganze zahl ist. was in B an dieser stelle ist wird da aber nicht fest gelegt. wenn du eine 0 rein soll musst du halt =0 hinschreiben.
wo in deinem code ein ans herkommt ist nicht ersichtlich.
das hat auch nix mit dem code da zu tun sondern mit dem funktionsaufruf denke ich mal. da musst du halt die ausgabe unterdrückenwenn du sie nicht haben willst. warum da ans steht verstehe ich aber sowieso nicht. mit ans weiterrechnen ist nicht sehr "stabil" programmiert. ich würde mir das rückgabergebniss deiner funktion schon seperat speichern wenn du das nochmal verwenden willst.. wovon ich ausgehe da du ja die ausgabe unterdrücke willst und es sonst ja sinnfrei wäre.
_________________
richtig Fragen
|
|
|
Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 02.06.2015, 22:44
Titel:
|
 |
Hallo dair,
Zitat: |
Das ändert aber genau gar nichts. Ich nehme mal, weil die > und < Attribute den round Befehl überschreiben. |
Hier scheint ein grundlegendes Verständnis-Problem zu liegen. Die "> und < Attribute" können auf keinen Fall den round Befehl "überschreiben". Die Idee des Überschreibens von Befehlen ist sehr weit von dem entfernt, wie Matlab als Programmier-Sprache funktioniert. Das Programm wird Zeile für Zeile abgearbeitet.
Wie schon vorher erklärt macht "B(round(A)==A);" nichts. Es wird nicht zugewiesen. Du bräuchtest:
Gruß, Jan
|
|
|
dair |
Themenstarter

Forum-Newbie
|
 |
Beiträge: 6
|
 |
|
 |
Anmeldedatum: 01.06.15
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 05.06.2015, 14:02
Titel:
|
 |
Damit funktioniert es in der Tat wie es soll.
Wenn man erst vor kurzem mit Matlab angefangen hat, ist das echt nicht so leicht da überall durchzusteigen. Zum Glück gibt es Leute wie euch, die einen weiter helfen können.
Perfekt, vielen Dank für die ganze Hilfe!
PS: Ich hätte noch eine kleine Frage zu einer möglichen Vereinfachung, hat aber nichts mehr mit der function zu tun:
Wenn ich mit dem sum Befehl mehrere Attribute summiere und sie mir anschließend einzeln ausgeben lasse, also beispielsweise:
Kann ich das auch irgendwie vereinfachen bzw. straffen, so dass ich zum Beispiel nur noch einmal sum anstatt dreimal bräuchte?
|
|
|
Harald |

Forum-Meister
|
 |
Beiträge: 24.501
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 05.06.2015, 15:03
Titel:
|
 |
Hallo,
falls x-z Spaltenvektoren sind:
Grüße,
Harald
|
|
|
dair |
Themenstarter

Forum-Newbie
|
 |
Beiträge: 6
|
 |
|
 |
Anmeldedatum: 01.06.15
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 05.06.2015, 16:38
Titel:
|
 |
Einwandfrei, vielen Dank.
Ich hatte das auch mit verschiedenen Klammer-Setzungen probiert, aber es hat nie so geklappt. Da sieht man mal was die richtige Position für einen Unterschied macht.
Was mir noch aufgefallen ist, hat das irgendeinen speziellen Grund, dass ihr immer ein Leerzeichen vor und nach dem = setzt? Das macht doch gar keinen Unterschied ob mit oder ohne Leerzeichen oder übersehe ich da gerade was?
|
|
|
Harald |

Forum-Meister
|
 |
Beiträge: 24.501
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 05.06.2015, 18:26
Titel:
|
 |
Hallo,
lediglichdieLesbarkeitdesCodesweilesohneLeerzeichenmanchmalschwierigerist ;)
Grüße,
Harald
|
|
|
dair |
Themenstarter

Forum-Newbie
|
 |
Beiträge: 6
|
 |
|
 |
Anmeldedatum: 01.06.15
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 05.06.2015, 18:37
Titel:
|
 |
Alles klar.
|
|
|
Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 06.06.2015, 16:31
Titel:
|
 |
Hallo dair,
Die Lesbarkeit wird höher, wenn Operatoren durch Leerzeichen getrennt sind. Und da die Debug-Zeit bei allen "größeren" Programmen die Laufzeit oft übersteigt, ist das extrem wichtig. Wenn man mal einen Bug in 200'000 Zeilen Code sucht, ist die Lesbarkeit des Codes fundamental.
Es gibt aber auch Spezial-Fälle, die Programmierer ganz schön verwirren können:
Bedeutet das nun 2.0 * a oder 2 .* a? Und ist ".2.*a" valider Matlbe Code? Immerhin ist ".2" equivalent zu "0.2", aber das steht so nicht explizit in der Dokumentation drin!
Na?
Deshalb ist es eine gute Idee, so klar wie möglich zu formulieren:
* Leerzeichen um alle Operatoren
* Kommata zwischen Elemente eines Vektors: [1, +2]
* Semicolons statt Zeilen-Umbrüche zwischen Zeilen eines Vektors
Gruß, Jan
|
|
|
|
|
Einstellungen und Berechtigungen
|
|
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
| 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.
|
|