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

Mithilfe einer function neue Matrix erstellen

 

dair
Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 01.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.06.2015, 01:14     Titel: Mithilfe einer function neue Matrix erstellen
  Antworten mit Zitat      
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:

Code:
function [ B ] = f( A )
%UNTITLED Summary of this function goes here
%   Detailed explanation goes here

if A>0
    B(A)=1;
elseif A<0
    B(A)=-1;
elseif A==0
    B(A)=0;
   
end


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.
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 01.06.2015, 02:57     Titel: Re: Mithilfe einer function neue Matrix erstellen
  Antworten mit Zitat      
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".

Code:
function B = f(A)
B = zeros(A);
for k = 1:numel(A)
  if A(k) > 0
    B(k) = 1;
    ... usw.
end
 
% oder:
B(A < 0) = -1;
...
 

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
dair
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 01.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.06.2015, 01:15     Titel:
  Antworten mit Zitat      
Hi Jan,

danke für deine Antwort. Ich habe jetzt mit den logical indicies etwas gearbeitet und das Ergebnis ist doch gleich viel besser:

Code:
B=zeros(size(A));
B(A>0)=1;
B(A<0)=-1;
B


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:

Code:
B=zeros(size(A));
B(A>0)=1;
B(A<0)=-1
B(round(A)==A);
B


Das ändert aber genau gar nichts. Ich nehme mal, weil die > und < Attribute den round Befehl überschreiben. Wie muss ich das ändern?
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 02.06.2015, 01:43     Titel:
  Antworten mit Zitat      
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
Code:
auch machen? du weist ja nix zu
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
dair
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 01.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.06.2015, 17:25     Titel:
  Antworten mit Zitat      
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?
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 02.06.2015, 17:33     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 02.06.2015, 22:44     Titel:
  Antworten mit Zitat      
Hallo dair,

Zitat:
Code:
B=zeros(size(A));
B(A>0)=1;
B(A<0)=-1
B(round(A)==A);
B

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:
Code:
B(round(A)~=A) = 0;


Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
dair
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 01.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.06.2015, 14:02     Titel:
  Antworten mit Zitat      
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! Smile



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:

Code:


Kann ich das auch irgendwie vereinfachen bzw. straffen, so dass ich zum Beispiel nur noch einmal sum anstatt dreimal bräuchte?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 05.06.2015, 15:03     Titel:
  Antworten mit Zitat      
Hallo,

falls x-z Spaltenvektoren sind:

Code:
a = sum( [x, y, z] )


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
dair
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 01.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.06.2015, 16:38     Titel:
  Antworten mit Zitat      
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?

Code:
a=1+2

a = 1+2
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 05.06.2015, 18:26     Titel:
  Antworten mit Zitat      
Hallo,

lediglichdieLesbarkeitdesCodesweilesohneLeerzeichenmanchmalschwierigerist ;)

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
dair
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 01.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.06.2015, 18:37     Titel:
  Antworten mit Zitat      
Alles klar. Very Happy
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 06.06.2015, 16:31     Titel:
  Antworten mit Zitat      
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:
Code:

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!
Code:
a = [1 + 2]
b = [1 +2]
 

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
Code:
Schlecht = [1
 2];
Gut = [1; ...
  2];

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
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.