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

M-File: Funktion auf jede Variable im Workspace anwenden

 

isochor
Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 01.10.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.10.2014, 11:02     Titel: M-File: Funktion auf jede Variable im Workspace anwenden
  Antworten mit Zitat      
Hallo Leute,

ich habe im Workspace hunderte Variablen. Jede Variable besteht aus tausenden von gemessenen Spannungen und den dazugehörigen Zeiten.

z.B.

A_1
A_2
.
.
.
Aletzte

A_1=[1,2; 9,8]

Jede Variable hat zwar immer 2 Spalten, jedoch wurden nicht immer gleich viele Messungen durchgeführt, so dass man bspw. in A1 1000 Zeilen hat, in A_2 1500 usw.


Ich will in einer M-File eine Funktion schreiben, die ich auf alle Variablen im Workspace anwenden will.

Die Funktion wäre z.B.

x=A_i(:,2)/1000-0,1

Also Teile mir die zweite Spalte durch 1000 und subtrahiere 0,1.


Ich will diese Funktion auf alle Variablen anwenden. Mein Ansatz war der, dass ich eine For-Schleife durchlaufen lasse

for i=1:1000

x=A_i(:,2)/1000-0,1

end

Das funktioniert aber aus verschiedenen Gründen nicht. Erstmal würde nach jeder Schleife das x ersetzt werden, er soll mir allerdings eine neue Variable mit dem Resultat im Workspace erstellen. Auch kann er auf "A_i" mit i=1,2,3 etc. im Workspace nicht zugreifen.


Mein zweiter Ansatz ist diese Funktion:
for i=1:1000
x = (sprintf('A_%d', i))
end


Hier macht er dann
x=A_1;
x=A_2;

etc. gibt mir aber nicht den Inhalt von A_1 wieder. Somit kann ich das nicht auf die Funktion anwenden.

Könnt ihr mir dabei helfen? Hoffe ich habe mein Problem verständlich formuliert.

Vielen Dank

Gruß
Private Nachricht senden Benutzer-Profile anzeigen


Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.10.2014, 11:11     Titel:
  Antworten mit Zitat      
Dein eigentliches Problem ist, dass Du Deine Werte doof abgelegt hast. Man packt Indizes nicht in den Variablennamen - in keiner Programmiersprache... Besser wäre die Verwendung von cells:

Code:

A{1} = [1, 2; 9, 8];
A{2} = [...; ...];
...
A{n} = [..., ...];

for idx = 1:numel(A)
   Ausgabe(idx) = spannende_funktion(A(idx));
end
 


Gibt auch noch ungefähr hundert weitere Beispiele hier im Forum und nochmal ungefähr 5000 Beiträge, die auf diese Beispiele hinweisen ;-)
Private Nachricht senden Benutzer-Profile anzeigen
 
isochor
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 01.10.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.10.2014, 13:19     Titel:
  Antworten mit Zitat      
Vielen Dank für die Antwort aber ich komme nicht ganz damit zurecht. Hab jetzt auch versucht die Ansätze aus den Beiträgen aus der Suchfunktion zu nutzen aber ich drehe mich irgendwie im Kreis.


Wenn ich im einfachsten Fall das hier versuche:

Code:
A{1} = [1, 2; 9, 8];
A{2} = [3, 4; 5,1];
A{3} = [5, 1; 1,4];


for idx = 1:numel(A)
   u_(idx) = (A(idx))*3;
end
 


Kommt als Fehlermeldung immer folgendes:
A =

[1x3 double]

??? Undefined function or method 'mtimes' for input arguments of type 'cell'.

Error in ==> neuer_Ansatz at 48
u_(idx) = (A(idx))*3;



"A = [1x3 double]" ist auch so ein Problem. Gebe ich A{1}=[1,2;3,4] ein, kommt als Ausgabe A=[1x2 double]. Was kann ich damit anfangen?
Private Nachricht senden Benutzer-Profile anzeigen
 
Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.10.2014, 13:26     Titel:
  Antworten mit Zitat      
Sorry, hatte einen Fehler im Code, cells werden mit geschweiften Klammern indiziert:

Code:

A{1} = [1, 2; 9, 8];
A{2} = [...; ...];
...
A{n} = [..., ...];

for idx = 1:numel(A)
   Ausgabe(idx) = spannende_funktion(A{idx});
end
 


Wenn die spannende Funktion keinen Skalar zurück gibt, könnte Deine Ausgabe-Variable zum Beispiel so erzeugt werden:

Code:

for idx = 1:numel(A)
   Ausgabe{idx} = spannende_funktion(A{idx});
end
 
Private Nachricht senden Benutzer-Profile anzeigen
 
isochor
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 01.10.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.10.2014, 13:36     Titel:
  Antworten mit Zitat      
mhhh,

wenn ich das jetzt so mache:

Code:
A{1} = [1, 2; 9, 8];
A{2} = [3, 4; 5,1];
A{3} = [5, 1; 1,4];


for idx = 1:numel(A)
   Ausgabe{idx} = (A{idx}*3)
end


kommt folgende Meldung:

Zitat:
Ausgabe =

[2x2 double] [2x2 double] [2x2 double]


Ausgabe =

[2x2 double] [2x2 double] [2x2 double]


Ausgabe =

[2x2 double] [2x2 double] [2x2 double]



Muss ich jetzt noch einen Befehl einfügen, damit ich jetzt eine Matrix bekomme mit den Werten der alten Matrix x 3?
Private Nachricht senden Benutzer-Profile anzeigen
 
Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.10.2014, 13:49     Titel:
  Antworten mit Zitat      
Welche alte Matrix? Du hattest 3 alte Matrizen und die Ergebnisse der Multiplikation stecken jetzt alle in der Variablen Ausgabe drin. Die einzelnen Matrizen kannst Du dann z.B. mit
Code:
Ausgabe{1}
angucken.
Private Nachricht senden Benutzer-Profile anzeigen
 
isochor
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 01.10.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.10.2014, 14:24     Titel:
  Antworten mit Zitat      
Suuuuper es klappt Very Happy

Ich wollte ja jedes Ergebnis in einer eigenen Variablen abspeichern. Habe noch in der For-Schleife
Code:
eval(['A_' num2str(idx) '=Ausgabe{idx}'])
eingefügt.

Vielen Dank ich saß so viele Stunden daran. Jeder Zeilencode ist zu Beginn so eine große Herausforderung Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.10.2014, 14:55     Titel:
  Antworten mit Zitat      
Das mit eval funktioniert zwar, ist aber echt nicht gut. Sollte man gar nicht erst damit anfangen - habe noch keinen Fall gesehen, wo es nicht vermeidbar gewesen wäre...
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.