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

varargin mit Paare

 

trust114
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 80
Anmeldedatum: 10.11.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.03.2016, 16:42     Titel:
  Antworten mit Zitat      
Also ein Bild das ich gerne über die Funktion ausgeben lassen will sieht so aus:

Code:

                    fig3=figure(3);
                    plot(MP{varargin{5}}(1:length(MP{varargin{5}})));
                    Name_Bild_3=varargin{5};
                    Title_Bild_3=num2str(Name_Bild_3);
                    title(['Titel', Title_Bild_3])
                    xlabel('x-Achse')
                    ylabel('y-Achse')
                    grid on
                    axis tight

 


An den Stellen wo Varargin{5} steht müsste die 1 von Bild hinein. Kannst du mir hierbei bitte noch helfen?
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: 19.03.2016, 17:39     Titel:
  Antworten mit Zitat      
Dann nutzt du die Struktur.

Der PropertyName ist der Feldname der Struktur. Wenn du also den Wert von Bild haben willst, musst du nur das entsprechende Feld der Struktur ansprechen: prop.Bild

Code:

plot(MP{prop.Bild}(1:length(MP{prop.Bild})));
 


Wenn du den Wert der Linienbreite verwenden möchstet, dann prop.Linienbreite.

Gruß DSP
Private Nachricht senden Benutzer-Profile anzeigen
 
trust114
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 80
Anmeldedatum: 10.11.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.03.2016, 17:42     Titel:
  Antworten mit Zitat      
Super Danke. Hat geklappt Very Happy
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: 19.03.2016, 19:31     Titel:
  Antworten mit Zitat      
Vielleicht noch ein Hinweis für dich zum Aufbau. Du kannst selbstverständlich die Variablennamen ändern.

Code:

% preallocate struct.feld
    mystruct.PropertyName = PropertyValue;  % bzw. hier z.B. empty array []    

    % Process inputs and set prop fields.
    mystruct = parsepropval(mystruct,varargin{:});
 


Aufruf:

Code:
testvarargin{'PropertyName',PropertyValue}


Die Funktion parsepropval vergleicht varargin mit den Feldnamen "PropertyName" des structs "mystruct". Ist der string "PropertyName" auch ein Feld in dem struct, wird der Wert des Paares zugewiesen. Du kannst also vor dem Aufruf der Funktion parsepropval, beliebig Felder hinzufügen. Der Name des Feldes ist dann gleichbedeutend mit dem Namen des Wertepaares von varargin.

Gruß DSP
Private Nachricht senden Benutzer-Profile anzeigen
 
trust114
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 80
Anmeldedatum: 10.11.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.03.2016, 19:43     Titel:
  Antworten mit Zitat      
Danke für den Zusatzhinweis. Eine klitzekleine Frage hätte ich allerdings noch.

Um meine Bilder aufzurufen, habe ich meinen Programminhalt in die oberste Funktion reingepackt. Über eine if-Bed. habe ich versucht die einzelnen Bilder nach Belieben aufzurufen.

Code:

if prop.Bild == 1
.
.
.
elseif prop.Bild == 3
        fig3=figure(3);
        plot(MP{prop.Messpunkt}(1:length(MP{prop.Messpunkt})),'color',prop.Farbe,'linewidth',prop.Linienbreite);% <= Hier liegt das Problem
        Name_Bild_3=prop.Messpunkt;
        Title_Bild_3=num2str(Name_Bild_3);
        title(['Zeit-Druck-Verlauf,  Messpunkt: ', Title_Bild_3])
        xlabel('Zeiteinheiten')
        ylabel('Druck')
        grid on
        axis tight
end
 


Wenn ich nun Farbe und Linienbreite benutze, klappt alles super. Falls nicht, zeigt der logischerweise einen Fehler an, da 'color' und 'linewidth' da stehen aber nicht verwendet werden. Über weitere if-Bed. wäre das zu handhaben, aber nur unter einem riesigen Aufwand möglich.

Kann es eventuell sein, das der Programminhalt in die Unterfunktion gehört?

Hast du vielleicht ne Idee?
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: 19.03.2016, 21:20     Titel:
  Antworten mit Zitat      
Welche Unterfunktion? Wenn du Felder des structs im deinem weiteren Code verwendest, die nicht in varargin enthalten sind, musst du sie logischerweise vorher irgendwie mit einem Default initialisieren.

Code:

function testvarargin(varargin)
    % Funktionsaufruf: testvarargin('PropertyName',PropertyValue,...)  
    % preallocate    
    prop.Farbe = 'default';
    prop.Linienbreite = 'default';

    % Process inputs and set prop fields.
    prop = parsepropval(prop,varargin{:});  
   
   
    % show prop structure
    prop
end
 


Aufruf nur mit Farbe:
Code:

>> testvarargin('Farbe','black')

prop =

           Farbe: 'black'
    Linienbreite: 'default'
 


Somit wird für das Feld Linienbreite der zuvor gesetzte Wert verwendet.

Gruß DSP
Private Nachricht senden Benutzer-Profile anzeigen
 
trust114
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 80
Anmeldedatum: 10.11.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.03.2016, 19:46     Titel:
  Antworten mit Zitat      
Super. 1000 Dank!
Private Nachricht senden Benutzer-Profile anzeigen
 
trust114
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 80
Anmeldedatum: 10.11.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.03.2016, 22:57     Titel:
  Antworten mit Zitat      
Hallo DSP,

hab noch ne Frage zu deinem letzten Beitrag. Kannst du mir erklären was die Default-Werte machen? Also es scheint ja, nun beliebig zu sein, ob ich bestimmte Parameter nutze oder nicht. Falls ich sie nutze wird der Default-Wert überschrieben. Was genau passiert denn, falls ich sie nicht benutze?

Danke und Schöne Grüße
Trust
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: 23.03.2016, 22:20     Titel:
  Antworten mit Zitat      
Hallo,

ich verstehe deine Frage ehrlich gesagt nicht ganz. In dieser Zeile wird z.B. die Linienbreite gesetzt.

Code:

plot(MP{prop.Messpunkt}(1:length(MP{prop.Messpunkt})),'color',prop.Farbe,'linewidth',prop.Linienbreite);% <= Hier liegt das Problem
 


Ist prop.Linienbreite nun kein input argument deiner Funktion und auch sonst nirgends im Code initialisiert, gibt es eine Fehlermeldung. Daher mein Vorschlag zu den verwendeten Eigenschaften/Feldern der Struktur defaults anzulegen. Der default Wert wird überschrieben, so fern das entsprechende input argument vorhanden ist. Der string 'default' ist natürlich in meinem Bsp. nur ein Platzhalter. Bei Linienbreite wäre natürlich eine Zahl als default sinnvoll.

Gruß DSP
Private Nachricht senden Benutzer-Profile anzeigen
 
trust114
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 80
Anmeldedatum: 10.11.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.03.2016, 23:57     Titel:
  Antworten mit Zitat      
ok, Danke, hab verstanden. Um nochmal ganz kurz auf dein Anfangsbeispiel zurück zu kommen.

Ich habe den Inhalt der Unterfunktion match_property in die Unterfunktion parsepropval rein gepackt, um die Übersicht etwas zu verbessern. Klappt auch ganz gut.

Was ich allerdings in der Unterfunktion parsepropval nicht ganz verstehe ist, was der Kopf der while schleife macht. Man definiert zunächst die Variable arg_index=1. Anschließend sagt man im Kopf der while-Schleife:

Code:


Aber mein length(varargin) ist doch immer größer gleich 1, da ich ja etwas eingebe. Und falls ich nichts eingebe zeigt der mir natürlich auch nichts an.

Schönen Gruß
Trust
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: 26.03.2016, 12:08     Titel:
  Antworten mit Zitat      
Hallo,

solche Fragen lassen sich am einfachsten mit dem Debugger klären. Breakpoint in gewünscht Codezeile setzen und Programm bis zum Breakpoint laufen lassen. Dann im Schrittmodus weiter und die Variablen konnen im Workspace überprüft werden. Die while Schleife wird nur ausgeführt, wenn varargin mindestens 1 Argument enthält. Allerdings sollten es ja immer Paare sein, so dass solch ein Aufruf logischerweise eine Fehlermeldung erzeugt.

Wenn du nichts übergibst, werden dann auch folgerichtig die Defaults des structs verwendet so fern sie definiert sind.

Gruß DSP
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: 05.04.2016, 17:50     Titel:
  Antworten mit Zitat      
Hallo,

versuche es mal damit:

Code:

function testvarargin(varargin)
    % Funktionsaufruf: testvarargin('PropertyName',PropertyValue,...)
    % PropertyName = Datei1
    %                Datei2
    %                Bild
    %                Farbe
    %                Linienstaerke
     
   
    % preallocate    
    prop.Farbe = 'default';
    prop.Linienbreite = 'default';

    % Process inputs and set prop fields.
    prop = parsepropval(prop,varargin{:});
   
    if ~isstruct(prop)
        % a Property is unknown
        return
    end
   
   
    % show prop structure
    prop
end

% -------------------- Subfunctions --------------------

    function prop = parsepropval(prop,varargin)
    % Parse property/value pairs and return a structure.
    properties = fieldnames(prop);
    arg_index = 1;
        while arg_index <= length(varargin)
            arg = varargin{arg_index};
            if ischar(arg)
                prop_index = match_property(arg,properties);
                if ~isempty(prop_index)
                    prop.(properties{prop_index}) = varargin{arg_index + 1};
                    arg_index = arg_index + 2;
                else
                    % error: Property is unknown
                    prop = [];
                    return
                end
            elseif isstruct(arg)
                arg_fn = fieldnames(arg);
                for i = 1:length(arg_fn)
                    prop_index = match_property(arg_fn{i},properties);
                    if ~isempty(prop_index)
                        prop.(properties{prop_index}) = arg.(arg_fn{i});
                    else
                        % error: Property is unknown
                        prop = [];
                        return
                    end
                end
                arg_index = arg_index + 1;
            else
                error(['Properties must be specified by property/value pairs',...
                    ' or structures.'])
            end
        end
    end

    % --------------------

    function prop_index = match_property(arg,properties)
        % Utility function for parsepropval.
        prop_index = find(strcmpi(arg,properties));
        if isempty(prop_index)
            prop_index = find(strcmp(arg,properties));
        end
        if length(prop_index) ~= 1
            % show error message on command window
            disp(['Property "' arg '" does not exist or is ambiguous.'])
        end
    end
 


Wenn die Eigenschaft nicht bekannt ist, wird jetzt im command window eine Fehlermeldung ausgegeben. Du kannst auch z.B. statt disp einen errordlg nutzen.

Gruß DSP
Private Nachricht senden Benutzer-Profile anzeigen
 
trust114
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 80
Anmeldedatum: 10.11.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.04.2016, 23:17     Titel:
  Antworten mit Zitat      
danke hat geklappt.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite Zurück  1, 2

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.