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

Hilfe!Frage zu Eingabeparametern in Funktion

 

Met03
Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 28.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.01.2009, 12:25     Titel: Hilfe!Frage zu Eingabeparametern in Funktion
  Antworten mit Zitat      
Hallo!

ich bin neu hier, das liegt wohl daran, dass ich zum ersten Mal programmieren muss.
Bitte entschuldigt komische Formulierungen Confused.

Zu meiner Frage:
In meinem M-file definiere ich eine Funktion mit zwei Eingabeparametern)
Später sollen es mal 22 werden

Code:
function r = programm(Eingabeparameter1, Eingabeparameter2, später...,Eingabeparameter22)
 
in einer folgenden Schleife
soll auf diese zugegriffen werden:

[height,ave,vel] = textread(name,'%f %f %f');

for i = 1:length(height)
        if height(i) == Eingabeparameter1
            k(i,:)=ave(i);          
            h(i,:)=vel(i);
       
            elseif height(i) == Eingabeparameter2
            k(i,:)=ave(i);          
            h(i,:)=vel(i);
             
später elseif für die restlichen Eingabeparameter
 
        else
            k(i,:)=NaN;
            h(i,:)=NaN;
        end
   end


mein Problem besteht nun darin, dass ich es mir offen lassen will, ob ich das Programm für nur einen Eingabeparameter rechnen lassen will oder ob die Schleife für alle Eingabeparameter durchlaufen soll.
Wenn ich oben
Code:
function r = programm(Eingabeparameter1, Eingabeparameter2)

im Programm wähle, aber mich für nur einen Eingabeparameter entscheide, dann kommt eine Fehlermeldung, da ich keinen zweiten Eingabeparameter angegeben habe.

Ok, das war bestimmt verwirrend, aber vielleicht versteht mich jemand und kann mir helfen.
Wäre super.

Gruss
Met02

Edit by Bijick: Code-Formatierung ergänzt. Bitte beim nächsten Mal selbst dran denken! Smile (Code-Button mittig über dem Eingabefenster)
Private Nachricht senden Benutzer-Profile anzeigen


Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 28.01.2009, 12:50     Titel:
  Antworten mit Zitat      
Hallo Met02,

was Du suchst ist varargin. Damit kann man Eingabeparameter variabel gestalten.

Code:
function r = programm(Eingabeparameter1, varargin)

if nargin < 2
    Eingabeparameter2 = inf; % oder sonstiges, was nicht normal vorkommt
else
    Eingabeparameter2 = varargin{1};
end

[height,ave,vel] = textread(name,'%f %f %f');

for i = 1:length(height)
    if height(i) == Eingabeparameter1
        k(i,:)=ave(i);          
        h(i,:)=vel(i);
       
    elseif height(i) == Eingabeparameter2
        k(i,:)=ave(i);          
        h(i,:)=vel(i);
    else
        k(i,:)=NaN;
        h(i,:)=NaN;
    end
end


Einfacher geht das Ganze aber so:

Code:
function r = programm(Eingabeparameter)

[height,ave,vel] = textread(name,'%f %f %f');

k = NaN(size(height));
h = NaN(size(height));

ind = ismember(height,Eingabeparameter));
k(ind) = ave(ind);
h(ind) = vel(ind);


Eingabeparameter kann dabei ein beliebig langer Vektor sein, also einen oder zwei oder 22 Einträge haben.

Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Met03
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 28.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.01.2009, 13:33     Titel:
  Antworten mit Zitat      
Hallo!

Vielen, vielen Dank für die Antwort, das erste klappt super, wenn ich deine abgespeckte Version Very Happy versuche, da habe ich noch nicht ganz verstanden, wie das dann mit zwei Eingabeparametern klappt.

du meintest, dass man da beliebig viele haben kann. aber wenn ich zum Beispiel das Programm aufrufe mit

programm(2,3)

dann kann er den zweiten Prameter nichts zuweisen.
Wahrscheinlich stell ich mich gerade voll blöd an.
Bin sowieso fasziniert, dass man die ersten ganzen Zeilen in so wenig zusammenfassen kann.

Liebe Grüsse
Met02
Private Nachricht senden Benutzer-Profile anzeigen
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 28.01.2009, 13:40     Titel:
  Antworten mit Zitat      
Hallo Met02,

der Aufruf geht dann mit

Code:
programm([2,3])
% oder
programm([2,3,4,5])


Ich wollte es erst dazuschreiben, hab es aber dann vergessen. Deine Faszination kann ich gut verstehen. Es gibt wirklich für fast alle Entscheidungsfragen, die man mit Schleifen nachbauen kann, vektorisierte Matlab-Funktionen wie beispielsweise ismember. Für das Verständnis Deines Problems ist es aber sehr hilfreich, sich die Schleife anzuschauen.

Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Met03
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 28.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.01.2009, 13:44     Titel:
  Antworten mit Zitat      
Wow, das ist ja klasse!

Könnt sein, dass ich noch öfter hier auftauche:).

vielen Dank!

LG
Met02
Private Nachricht senden Benutzer-Profile anzeigen
 
Met03
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 28.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.01.2009, 20:44     Titel:
  Antworten mit Zitat      
Hallo!
Ich nochmal, kannst du mir sagen, was ich mache, wenn in der ursprünglichen Matrix [height,ave,vel] noch eine Spalte mit strings dazukommt. Z.B. [strin,height,ave,vel]

Text 3 4 3
Text1 2 5 3
Text2 4 1 5

als Eingabeparameter wähle ich z.B. 3
ich möchte am Ende aber eine Ausgabe A haben, die dann so aussieht:

A= Text 4 3

function r = programm(Eingabeparameter)

[strin,height,ave,vel] = textread(name,'%s %f %f %f');

und jetzt weiss ich schon nicht weiter

k = NaN(size(height));
h = NaN(size(height));

ind = ismember(height,Eingabeparameter));
k(ind) = ave(ind);
h(ind) = vel(ind);

a=k(~isnan(k));
b=h(~isnan(h));

A=[a b]


Vielleicht könntest du mir da helfen?
LG
Met02
Private Nachricht senden Benutzer-Profile anzeigen
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 28.01.2009, 21:04     Titel:
  Antworten mit Zitat      
Hallo Met02,

bitte denke an die Code-Formatierung, die erleichtert die Übersicht enorm.

Mein Vorschlag:

Code:
function r = programm(Eingabeparameter)

[strin,height,ave,vel] = textread(name,'%s %f %f %f');

ind = ismember(height,Eingabeparameter));
s = strin(ind);
a = ave(ind);
b = vel(ind);

A=[strin num2str(a) num2str(b)]


Weiterrechnen kann man mit A aber nicht, da die Zahlen in Strings umgewandelt wurden. Eine Alternative sind cell-Variablen, die jeden Variablentyp aufnehmen. Das kommt dann darauf an, wie Du weiter damit arbeiten willst.

Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Met03
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 28.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.01.2009, 21:42     Titel:
  Antworten mit Zitat      
Hallo, das klappt irgendwie nicht, er meldet dann

??? Error using ==> horzcat
The following error occurred converting from char to cell:
Error using ==> cell
Conversion to cell from char is not possible.

Error in ==> program_10 at 20
A=[strin num2str(a) num2str(b)]

Mache ich was falsch?

Wo ist denn der Teil mit den NaN´s geblieben,


Code:
k = NaN(size(height));
h = NaN(size(height));

ind = ismember(height,Eingabeparameter);
k(ind) = ave(ind);
h(ind) = vel(ind);

a=k(~isnan(k));
b=h(~isnan(h));



braucht man den dann gar nicht mehr?

Danke.
Met02
[/code]
Private Nachricht senden Benutzer-Profile anzeigen
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 29.01.2009, 11:14     Titel:
  Antworten mit Zitat      
Hallo Met02,

der Fehler liegt bei mir, ich habe den Strings zuwenig Aufmerksamkeit geschenkt. Gib doch bitte mal das genaue Format der Variable strin an (herauszufinden mit whos).

Den Teil mit den NaNs braucht man tatsächlich nicht. Es sei denn, Du willst noch auf andere Weise mit h und k weiterrechnen.

Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Met03
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 28.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.01.2009, 11:32     Titel:
  Antworten mit Zitat      
Hi!

strin: 'strin'

size: [4 1]
bytes: 284
class: 'cell'

ich wollte mit a und b weiterrechnen, das geht aber, oder?
Oder brauche ich dann die NaN´s?

Code:
function r = programm(Eingabeparameter)

[strin,height,ave,vel] = textread(name,'%s %f %f %f');

ind = ismember(height,Eingabeparameter));
s = strin(ind);
a = ave(ind);
b = vel(ind);

A=[strin num2str(a) num2str(b)]


Danke.
LG Met02
Private Nachricht senden Benutzer-Profile anzeigen
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 29.01.2009, 12:50     Titel:
  Antworten mit Zitat      
Hallo Met02,

weiterrechnen mit a und b geht.

Mit den Strings komme ich jetzt auf:

Code:
function r = programm(Eingabeparameter)

[strin,height,ave,vel] = textread(name,'%s %f %f %f');

ind = ismember(height,Eingabeparameter));
s = {strin{ind}}';
a = ave(ind)';
b = vel(ind)';

% Entweder character-array (nur zum anschauen)
leer = repmat(' ',length(a),1)
A = [char(s) leer num2str(a) leer num2str(b)]

% Oder cell array (verwirrende Ausgabe, ist aber alles da)
A = {s,a,b};


Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Met03
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 28.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.01.2009, 13:53     Titel:
  Antworten mit Zitat      
Hallo!

Vielen, vielen Dank Very Happy
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.