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

function variabel halten

 

Atmos_kk
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 93
Anmeldedatum: 23.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.08.2011, 09:34     Titel: function variabel halten
  Antworten mit Zitat      
Moin zusammen,

ich bin auf der Suche nach einem kleinem Anstoß wie ich in einer function die Eingabe- und Übergabeparameter variabel halten kann.

Kleine Erklärung:

Ich hab eine function, bei der ich zur Zeit 3 Vektoren mit je 8 Elementen als Eingabeparameter habe. Was ist jedoch wenn ich plötzlich 5 Vektoren mit 24 Elementen benötige oder irgendeine andere Kombination.

Es muss doch irgendwie möglich sein so einen Fall zu Programmieren. Es wäre ja etwas viel Aufwand für jedes Mal eine neue Function zu schreiben. Dann würde man diese ja nicht mehr benötigen.

Also ich habe gelernt, dass man alles mit Matlab machen kann also bin ich auch hier sehr zuversichtig, dass mir jemand etwas unter die Arme greifen kann!

Greetz
Private Nachricht senden Benutzer-Profile anzeigen


eupho
Forum-Meister

Forum-Meister


Beiträge: 777
Anmeldedatum: 07.01.09
Wohnort: Marburg
Version: R2009b
     Beitrag Verfasst am: 26.08.2011, 09:47     Titel:
  Antworten mit Zitat      
Das ist sehr individuell, je nachdem wie die Werte zusammengehören und was damit passieren soll.

Wenn die Werte zusammengehören, so kannst du doch alles in ein 2D-Array packen und nur die eine Variable übergeben.
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: 26.08.2011, 10:05     Titel: Re: function variabel halten
  Antworten mit Zitat      
Hallo Atmos_kk,

Du könntest VARARGIN verwenden, dass eine variable Anzahl von Inputs aufnimmt und als CELL-Vektor verfügbar macht.

Oder Du kann einen STRUCT als Input verwenden und die Funktion in Abhängigkeit von der Anzahl der Felder ausführen lassen.

Ein CELL Array als Input ist ebenfalls möglich.

Und dann kannst Du noch alle drei Methoden mischen, wie z.B. beim UICONTROL-Befehl und den anderen HG-Befehlen auch (FIGURE, PLOT, etc).

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 93
Anmeldedatum: 23.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.08.2011, 10:08     Titel:
  Antworten mit Zitat      
Ja moinsen,

also vielen Dank für die schnellen Antworten. Allerdings gibt es da kleine Verständnisprobleme meinerseits. Bin noch nicht so lange dabei. Gibt es für sowas ein kleines Beispiel wo man sich das mal anschauen kann?

Greetz
Private Nachricht senden Benutzer-Profile anzeigen
 
Atmos_kk
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 93
Anmeldedatum: 23.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.08.2011, 10:09     Titel:
  Antworten mit Zitat      
Schande über mein Haupt. Man sollte besser erstmal in der Help nachlesen bevor man sofort wieder was neues fragt!

Dank euch!
Private Nachricht senden Benutzer-Profile anzeigen
 
Atmos_kk
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 93
Anmeldedatum: 23.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.09.2011, 06:36     Titel:
  Antworten mit Zitat      
Also ich hab mich da jetzt mal etwas reingelesen muss allerdings sagen, dass die Beispiele mir irgendwie nicht ganz helfen. Vielleicht fehlt mir auch nur ein weiterer Teil um das umzusetzen zu können was ich brauche.

Bei mir geht es zum Beispiel darum, dass ich Daten aus ungefähr 3-12 .txt files einlesen muss. Dazu will ich die Eingabe variabel halten und die Ausgabe in der Funktion.

Beispiel:

Code:


function [x1,y1,x2,y2,...,x12,y12] =
txt_einlesen(Datei1,Datei2,Datei3,...,Datei12)

Rohdaten1 = dlmread(Datei1,'\t',23,0);     %Für Datei wird ein kompletter Pfad angegeben
...
Rohdaten12 = dlmread(Datei12,'\t',23,0);

x1 = Rohdaten(:,1);
y1 = Rohdaten(:,2);
...
x12 = ...;
y12 = ...;

 


So nun weiß ich aber nie ob ich 3 oder mehr Dateien einlesen will bzw. muss und möchte gerne die Eingabe und die Ausgabe variabel halten. Kann mir da eventuell einer bei behilflich sein?

Greetz
Private Nachricht senden Benutzer-Profile anzeigen
 
Micha85

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.09.2011, 08:49     Titel:
  Antworten mit Zitat      
Hi,

benutze doch wie schon erwähnt ein struct als Eingangsgröße. Ich denke das ist in Deinem Fall das einfachste:

Code:

DeinStruct = struct;
DeinStruct.Datei1 = rand(10);
DeinStruct.Datei2 = rand(10);

function [AusgabeStruct] = txt_einlesen(DeinStruct)
for i=1:1:length(fieldnames(DeinStruct))
     % Bearbeitung für jede Datei im struct durchführen
end
end
 


So in der Art könnte das aussehen. Ich hoffe das bringt Dich weiter.
Grüße
Micha
 
Atmos_kk
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 93
Anmeldedatum: 23.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.09.2011, 09:02     Titel:
  Antworten mit Zitat      
Mir ist nicht ganz klar, was ich wo eintrage soll!
Woher weiß denn dann das System was ich wo haben möchte?
Du hast nicht zufällig ein etwas klareres Beispiel als MATLAB? Ich komme irgendwie mit der Hilfe nicht ganz so gut klar!
Private Nachricht senden Benutzer-Profile anzeigen
 
Atmos_kk
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 93
Anmeldedatum: 23.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.09.2011, 09:13     Titel:
  Antworten mit Zitat      
Ich habe gerade mal genauer hingesehen und bemerkt, dass man entweder einen cell array oder einen sclar value eintragen kann. Von daher ist das für mich meiner Meinung nach nicht relevant, weil ich dann vorher die Daten ja noch wieder manuell einlesen müsste. Genau das will ich ja vermeiden!
Private Nachricht senden Benutzer-Profile anzeigen
 
Micha85

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.09.2011, 09:27     Titel:
  Antworten mit Zitat      
Hi,

wenn Deine beliebige Anzahl an txt-Files nun alle in einem Ordner abgelegt sind, könntest Du mit Befehlen wie "dir" usw. die Dateinamen zum Beispiel in ein Cell-Array packen und als Eingang für Deine Funktion nutzen.
In einer Schleife gehst Du anschließend alle Dateien durch und speicherst die Ergebnisse in einem struct ab.
Code:

for i=1:1:AnzahlDateien
    % Berechnungen
    Ergebnis.['Datei_' num2str(i)] = ...;
end
 

Wenn also die Operationen beim Einlesen Deiner Daten immer identisch sind wäre die Funktion so vollvariabel im hinblick auf die Anzahl der Dateien.

Grüße
Micha
 
_Peter_
Moderator

Moderator


Beiträge: 537
Anmeldedatum: 08.12.10
Wohnort: ---
Version: 7.10, 2010a
     Beitrag Verfasst am: 08.09.2011, 09:34     Titel:
  Antworten mit Zitat      
Micha85 hat Folgendes geschrieben:
Code:

DeinStruct = struct;
DeinStruct.Datei1 = rand(10);
DeinStruct.Datei2 = rand(10);

function [AusgabeStruct] = txt_einlesen(DeinStruct)
for i=1:1:length(fieldnames(DeinStruct))
     % Bearbeitung für jede Datei im struct durchführen
end
end
 

Dazu eine Anmerkung: Für das Handling mit den Daten wäre folgende Structbelegung vorteilhafter:
Code:

DeinStruct = struct;
DeinStruct(1).Datei = rand(10);
DeinStruct(2).Datei = rand(10);
...

Oder am besten gleich über eine Schleife einlesen in Verbindugn mit dem "dir" Befehl.
_________________

Gruß
Peter
_________________
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht? Oder der MATLAB Hilfe?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
Private Nachricht senden Benutzer-Profile anzeigen
 
Atmos_kk
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 93
Anmeldedatum: 23.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.09.2011, 09:42     Titel:
  Antworten mit Zitat      
Alles klar meine bisherigen Fähigkeiten mit MATLAB sind noch sehr eingeschränkt.

Habe gerade mal 'dir' ausprobiert und da ist das Problem, dass ich in meinen Daten auch eine Menge Text stehen habe. Deswegen fange ich auch erst in Zeile 24 an auszulesen. Dadurch funktioniert das nicht so gut mit 'dir'.
Kann man den Befehl auch irgendwie einschränken?

Mit dem struct bin ich leider auch noch nicht weiter! Irgendwie will das nicht bei mir rein. Hast du dafür nicht ein kleines Beispiel?

Greetz
Private Nachricht senden Benutzer-Profile anzeigen
 
_Peter_
Moderator

Moderator


Beiträge: 537
Anmeldedatum: 08.12.10
Wohnort: ---
Version: 7.10, 2010a
     Beitrag Verfasst am: 08.09.2011, 14:53     Titel:
  Antworten mit Zitat      
Hallo Atmos,
hier ein Beispiel:

Code:

Rohdaten = struct();
list_filenames = dir('test_folder');
for i = 1 : length(list_filenames)
 Rohdaten(i).Name = list_filenames.name;
 Rohdaten(i).Data = dlmread(list_filenames.name,'\t',23,0);
 ...
end
 


Somit solltest du deine daten in Rohdaten(1).Data bis Rohdaten(n).Data haben.
_________________

Gruß
Peter
_________________
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht? Oder der MATLAB Hilfe?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
Private Nachricht senden Benutzer-Profile anzeigen
 
Atmos_kk
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 93
Anmeldedatum: 23.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.09.2011, 05:52     Titel:
  Antworten mit Zitat      
Moin zusammen,

erstmal vielen Dank für die Antwort aber dieses struct ist ein Rätsel für mich. Ich habe gestern noch folgendes erstellt, ist zwar noch nicht ganz fertig aber ich wollte es mal posten vielleicht interessiert es ja noch jemand anderen.

Code:


function [varargout] = einlesen_test(Delimiter,Anfang_Zeile,Anfang_Spalte,varargin)

for k = 1:size(varargin,2)

     Ausgabe =  dlmread(varargin(k),Delimiter,Anfang_Zeile,Anfang_Spalte);
     Groesse = size(Ausgabe);
     m = Groesse(:,1);
     n  = Groesse(:,2);
     Rohdaten = zeros([m n size(varargin,2)]);
     Rohdaten(:,:,k) = Ausgabe;
     varargout(k) = {Rohdaten(:,:,k)};

end

 


Gibt mit Sicherheit noch was zu verbessern aber vorerst funktioniert es.

Man hätte auch direkt nach dlmread schon das varargout(k) = Ausgabe setzen können aber wie schon gesagt ich muss das jetzt noch so bearbeiten, dass ich automatisch die Spalten aller Matrizen in Vektoren bekomme und mir die ausgegeben werden!

Wenn jemand weiß wie man das mit dem struct macht immer her damit. Würde mich wirklich interessieren und vielleicht verstehe ich das dann mal endlich.

Wenn alles fertig ist, poste ich nochmal die vollständige function!

Aso, das mit dem dir Befehl funktioniert nicht. Dabei liest er nicht meine Daten ein sondern gibt mir nur "Müll" aus!

Greetz
Private Nachricht senden Benutzer-Profile anzeigen
 
_Peter_
Moderator

Moderator


Beiträge: 537
Anmeldedatum: 08.12.10
Wohnort: ---
Version: 7.10, 2010a
     Beitrag Verfasst am: 09.09.2011, 08:36     Titel:
  Antworten mit Zitat      
Hallo Atmos_kk,
nach deinen ANtworten, kann ich dir leider nicht helfen.
Atmos_kk hat Folgendes geschrieben:

Wenn jemand weiß wie man das mit dem struct macht immer her damit. Würde mich wirklich interessieren und vielleicht verstehe ich das dann mal endlich.

Was verstehst du denn nicht? Was für ein Problem bereitet dir der Programmrahmen den ich dir vorgeschlagen habe?
Atmos_kk hat Folgendes geschrieben:

Aso, das mit dem dir Befehl funktioniert nicht. Dabei liest er nicht meine Daten ein sondern gibt mir nur "Müll" aus!

Diese Aussage, ist mit Verlaub, auch "Müll" für uns Antwortende.
Auf diese Aussage, kann man nicht Antworten. Was ist "Müll"? Was hast du geschrieben? Fehlermeldung? Sollverhalten? Istverhalten?

Bitte alles immer so präzise wie möglich angeben, dann ist das Antworten wesentlich leichter.
_________________

Gruß
Peter
_________________
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht? Oder der MATLAB Hilfe?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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.