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

try-catch Anweisung zur Programmunterscheidung

 

beepbeep
Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 17.12.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.12.2015, 12:07     Titel: try-catch Anweisung zur Programmunterscheidung
  Antworten mit Zitat      
Guten Tag liebe Gomatlab-Community,

ich würde gerne einen Programmcode schreiben, welcher sowohl unter Matlab, als auch unter Octave lauffähig ist.
Um dies zu ermöglichen wird eine Programmunterscheidung benötigt, da verschiedene Funktionen nicht unterstützt werden.
Hierzu möchte ich einen Flag setzen, welcher für Matlab true und Octave false ist.
Meine Idee ist es dies über eine 'Try-Catch' Anweisung zu ermöglichen.
Code:

mat_oct_flag=false
try
2**3
catch
mat_oct_flag=true
end
 



Leider bricht Matlab schon in der 'try-Zeile' ab und liefert Error: Unexpected MATLAB operator.
Eine If schleife führt zu demselben Ergebniss.
Code:

if 2**3=8; mat_oct=false;
 else mat_oct=true;
 end
 


Ich wäre euch sehr dankbar , falls ihr mir hier weiterhelfen könntet.

Liebe Grüße beepbeep
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: 17.12.2015, 12:52     Titel: Re: try-catch Anweisung zur Programmunterscheidung
  Antworten mit Zitat      
Hallo beepbeep,

Matlab interpretiert nur Code, den Matlab interpretieren kann. Deshalb kann ein M-File, das den Operator ** enthält, nicht eingelesen werden. Entweder Du verwendest diesen Operator nur in Files, die lediglich in Octave ausgeführt werden, oder Du benutzt statt dessen den Befehl power .

Hilfreich wird eine solche Funktion sein:
Code:
function Reply = isOctave()
  persistent isOctaveValue
  if isempty (isOctaveValue)
    isOctaveValue = exist ('OCTAVE_VERSION', 'builtin');
  end
  Reply = isOctaveValue;
end

Dann:
Code:
if isOctave()
  Result = FunctionWithPowerOperator_Oct(Data);
else
  Result = FunctionWithPowerOperator_Mat(Data);
end

% Eigenes File:
function Result = FunctionWithPowerOperator_Oct(Data)
  Result = Data ** 3;
end

% Eigenes File:
function Result = FunctionWithPowerOperator_Mat(Data)
  Result = Data ^ 3;
end


Da erscheint mir der power Operator übersichtlicher.

Zitat:
Eine If schleife führt zu demselben Ergebniss.
#
Es ist verblüffend, wie oft man im Forum den Ausdruck "IF-Schleife" findet, dabei is "IF" ganz eindeutig keine Schleife.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 17.12.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.12.2015, 15:08     Titel: Re: try-catch Anweisung zur Programmunterscheidung
  Antworten mit Zitat      
Hallo Jan,

vielen Dank für deine schnelle Rückmeldung.

Ich werde es mit deinen Tipps versuchen und mich dann melden.

Gruß

beepbeep
Private Nachricht senden Benutzer-Profile anzeigen
 
beepbeep
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 17.12.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.01.2016, 19:30     Titel:
  Antworten mit Zitat      
Hallo im neuen Jahr,

bitte verzeih, dass erst jetzt die Rückmeldung kommt.

dein Tipp habe ich leider nicht umsetzen können.

Habe allerdings eine Lösung gefunden.

mit Hilfe von

Code:


hier besteht der Unterschied zwischen Matlab und Octave darin, dass in Matlab

Code:

nargin

ans =
        6
 


hingegen unter Octave

Code:

nargin

ans =
        1
 


habe dies genutzt um eine globale Variable zu definieren

Code:


global mat_oct

if nargin == 1
mat_oct = 1;
else
mat_oct = 0;
end
 



Nun habe ich alle Unterschiede im Code vorher mit einer if-Abfrage "filtern" lassen.


getestet habe ich das ganze unter Octave Version 4.0.0 und Matlab Version 8.2.0.701 (R2013b)
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 13.01.2016, 20:12     Titel:
  Antworten mit Zitat      
Hallo,

also irgendwie verstehe ich deine Umsetzung nicht. Was hat nargin mit einem Test auf Octave zu tun? Bist du dir wirklich sicher, dass es nicht auch unter Matlab den Rückgabewert 1 haben kann?

Jan hat dir doch ein lauffähiges Bsp. gepostet, welches imho deutlich sinnvoller als ein "nargin-test" ist. Ich würde mich an deiner Stelle bemühen Jan's Vorschlag nachzuvollziehen bzw. zu fragen, wenn etwas unklar ist.
Private Nachricht senden Benutzer-Profile anzeigen
 
beepbeep
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 17.12.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.01.2016, 22:44     Titel:
  Antworten mit Zitat      
Hallo,

natürlich kann "nargin" unter matlab auch den Wert 1 annehmen.

Der code den ich unter beiden Programmen lauffähig machen möchte beginnt allerdings mit clear all und scheinbar (zumindest ist das meine Vermutung) interpretiert Matlab im "Grundzustand" "nargin" als 6 wegen der 6 "Buchstaben" und in Octave wird "nargin" als 1 "Wort" interpretiert.

Habe den Code bzw. das Programm mit meiner Lösung sowohl unter Matlab und Octave laufen lassen.
Die ursprüngliche Version war nur unter Matlab lauffähig.

Die Idee habe ich aus dem Programm selbst, da dort bereits eine Unterscheidung zwischen Matlab Version kleiner und größergleich 5 gemacht wird, da es den Befehl "flops" ab Version 5 scheinbar nicht mehr gibt.
Private Nachricht senden Benutzer-Profile anzeigen
 
Mmmartina
Forum-Meister

Forum-Meister


Beiträge: 745
Anmeldedatum: 30.10.12
Wohnort: hier
Version: R2020a
     Beitrag Verfasst am: 14.01.2016, 08:55     Titel:
  Antworten mit Zitat      
Hallo beepbeep,,
was ist dein Ziel?
Alles nur *irgendwie* hinzufrickeln, oder eine ordentliche Lösung zu bekommen, welche einen einigermaßen ordentlichen Programmierstil einhält?

beepbeep hat Folgendes geschrieben:
natürlich kann "nargin" unter matlab auch den Wert 1 annehmen.
[...]
und scheinbar (zumindest ist das meine Vermutung) interpretiert Matlab im "Grundzustand" "nargin" als 6 wegen der 6 "Buchstaben" und in Octave wird "nargin" als 1 "Wort" interpretiert..

Dann ist dies schlicht nicht als sichere Unterscheidung geeignet.
"Vielleicht ist das das Gaspedal, wenn jemand anderes das Auto fährt, bremst es aber damit. Aber vermutlich paßt das so."

beepbeep hat Folgendes geschrieben:
Der code den ich unter beiden Programmen lauffähig machen möchte beginnt allerdings mit clear all

Natürlich kann ich, wenn ich ein Zimmer neu streichen will, erstmal das ganze Haus abreißen und neu bauen...
Ein clear all ist so gut wie nie sinnvoll.
Was steht denn in "nargin" zur Laufzeit drinn? Hast du dies mal überprüft?
_________________

LG
Martina

"Wenn wir bedenken, daß wir alle verrückt sind, ist das Leben erklärt." (Mark Twain))
Private Nachricht senden Benutzer-Profile anzeigen
 
beepbeep
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 17.12.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.01.2016, 14:17     Titel:
  Antworten mit Zitat      
Hallo Martina,

verzeih, dass ich mich erst jetzt melde.

Was wäre denn eine Abfrage, die einen entsprechenden Programmierstil einhält, bei der ich als Antwort meine globale Variable mat_oct für Octave mat_oct = 1 und für Matlab mat_oct = 0 stetzen kann.

Ich möchte nicht zwei komplette Programmdateien erstellen. Der Code unterscheidet sich lediglich an 4 Stellen, die ich durch eine if Abfrage nach mat_oct unterscheiden möchte.

Liebe Grüße

beepbeep
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: 19.01.2016, 16:46     Titel:
  Antworten mit Zitat      
wozu brauchst du denn globale variablen ? jan hat oben doch die funktion isOctave gepostet. die gibt dir doch 1 oder 0 zurück je nachdem ob matlab oder octave läuft.
was genau hat denn dabei nicht geklappt ?
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
beepbeep
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 17.12.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.01.2016, 17:59     Titel:
  Antworten mit Zitat      
Habe mich jetzt nochmals intensiv mit Jans Antwort auseinander gesetzt.

Mir hat für meine Unterscheidung die Zeile

exist ('OCTAVE-VERSION', 'builtin')

gereicht.

Mit Hilfe dieser Abfrage habe ich mir nun mit

Code:
if exist  ('OCTAVE-VERSION', 'builtin') == 0;
mat_oct = 0;
else
mat_oct = 1;
end


meine Variable definiert.

Im vorhanden Programm wird mit globalen Variablen gearbeitet, also habe ich hier nur eine hinzugefügt ( global mat_oct ) und an allen Stellen wo der Code sich unterscheiden soll eine If abfrage, wie bereits bei der nargin Lösung.

Ist dies jetzte eine Lösung die vom Programmierstil her akzeptabel ist?

Habe mich dabei an dem vorhanden Programm orientiert.

Liebe Grüße
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: 19.01.2016, 18:41     Titel:
  Antworten mit Zitat      
naja globale variablen sind nicht sehr schön. sie sind unübersichtlich und vergrößern das risiko von namenskollisionen
darum die funktion isOctave
wird sie in malab ausgeführt hat sie den rückgabe wert 0 in octave ist er nicht 0
da rum kannst du dann einfach machen
Code:
if isoctave
octave funktion
else
matlab funktion
end

auf dein beispiel oben bezogen
Code:
if isOctave()
a=2**3
else
a=2^3
end

so wie jan das oben im zweiten teil beschrieben hat.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
beepbeep
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 17.12.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.01.2016, 20:00     Titel:
  Antworten mit Zitat      
Alles klar, dann versuche ich die globale Variable zu vermeiden.

vielen Dank euch allen für die Mithilfe
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 - 2024 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.