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

Variablen automatisch erzeugen ?!?

 

Pete

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.11.2007, 09:49     Titel: Variablen automatisch erzeugen ?!?
  Antworten mit Zitat      
Hallo...

Muss für ein Projekt in der Hochschule einige Sachen in Matlab schreiben und kenne mich noch nicht so gut aus.
Ich brauche mehrere Variablen die von einer Schleife automatisch erzeugt werden. Kenne das aus C, habe aber in der Matlab-Hilfe noch nix darüber gefunden.
Es soll ungefähr so aussehen: Variablen x1...x7

for i=1:7
x(i)=...
end

habe schon (i),[i], ausprobiert und es hat nicht funktioniert.
kann mir da wer weiterhelfen?

Danke im Voraus


outsider
Forum-Meister

Forum-Meister


Beiträge: 806
Anmeldedatum: 03.09.07
Wohnort: München
Version: R2012b
     Beitrag Verfasst am: 22.11.2007, 10:39     Titel:
  Antworten mit Zitat      
Schaue nach den Funktionen EVAL, EVALIN, ASSIGNIN

Code:
for i=1:5
   eval(sprintf('x%d=rand(1)',i))
end




MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
Pete

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.11.2007, 10:59     Titel:
  Antworten mit Zitat      
ahh ok...

aber wie kann ich das in der gui einbinden?

Habe folgendes:

for k=1:7
handles.cfun = fit(handles.x2,handles.y(:,k),'poly2');
plot(handles.cfun, 'g')
end

was er auch macht aber er überschreibt eben bei jedem schleifendurchgang das handles.cfun ... ich brauch jetzt handles.cfun1...handles.cfun7.
 
outsider
Forum-Meister

Forum-Meister


Beiträge: 806
Anmeldedatum: 03.09.07
Wohnort: München
Version: R2012b
     Beitrag Verfasst am: 22.11.2007, 11:42     Titel:
  Antworten mit Zitat      
wenn Du einen Struct erweitern willst, dann geht es viel einfacher mit SETFIELD.
Code:
>> handles = struct;
for i=1:5
   handles = setfield(handles,sprintf('c%d',i),rand(1));
end% for
handles

handles =

    c1: 0.3545
    c2: 0.4301
    c3: 0.5722
    c4: 0.7008
    c5: 0.7425




MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
Pete

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.11.2007, 11:53     Titel:
  Antworten mit Zitat      
Mensch hier gibts aber schnelle Antworten Smile noch eine letzte Frage... wie plotte ich das dann? innerhalb der schleife ohne plot (c1)... plot(c2)... schreiben zu müssen

habe das mit
plot(eval('x%d',i),y)

versucht, bringt folgende fehlermeldung:


??? Error using ==> plot
Conversion to double from struct is not possible.
 
outsider
Forum-Meister

Forum-Meister


Beiträge: 806
Anmeldedatum: 03.09.07
Wohnort: München
Version: R2012b
     Beitrag Verfasst am: 22.11.2007, 13:01     Titel:
  Antworten mit Zitat      
damit kannst Du die Felder plotten
die 2 Zeile selectiert nur die Namen, die mit "c" anfangen, da ja nicht alle Elemente der Handlesstruktur plottbar sind...

Code:
fld = fieldnames(handles);
fld = fld(strncmp(fld,'c',1))
for i=fld'
   plot(handles.(char(i)))
   hold on
end% for





MfG
P.S. trotz der Tatsache, dass es so funzt, ist diese Lösung weder schön und gut, noch robust und elegant... Aber Du musst es wissen... Ich hätte lieber nur eine einzige Variable angelegt die alle Werte als Array umfasst. Falls die jeweiligen Vektoren unterschiedlich lang sind, dann sollten die CellArrays zum Einsatz kommen. So oder So würde man dann die FOR-Schleifen loswerden und der Code ist übersichtlicher und kleiner...
Private Nachricht senden Benutzer-Profile anzeigen
 
Pete

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.11.2007, 10:34     Titel:
  Antworten mit Zitat      
Ja das ist nicht "elegant" ... aber ich versteh nicht ganz wie ich das besser machen kann... ich schilder mal genau was ich machen will.

Also ich hab eine GUI wo ich per Knopfdruck Daten fiten möchte.
Ich habe eine 7x7 Matrix handles.y und eine handles.x2 als Spaltenvektor.
Es soll also jeweils eine Spalte der Matrix mit x2 gefittet werden.
Ich brauche 7 Kurven die ich dann weiterverwenden möchte (ausgeben und speichern).


Und Problem 2:

habe diese 7x7 matrix aus einem spaltenvektor mit 49 Werten über 2 ineinander verschachtelten for-schleifen erzeugt. Da ich mitlerweile überall gelesen habe das das nicht "die feine Art" ist, möchte ich wissen ob das einfacher geht. Das soll aber einmal eine matrix sein die die 1ten 7 Werte in die 1ste Spalte dann nächsten 7 Werte in die 2te Spalte ... schreibt.
Die 2te Matrix soll aber so aussehen: 1,7,14,..., Wert ind die 1te Spalte dann 2,8,15,..., Wert in die 2te Spalte.

Hatte das bisher so gelöst *schäm* Wink

Code:

for i=1:7
    for j=1:7
        handles.x(i,j)=handles.Mx(i*7+j-7);                
        handles.y(j,i)=handles.My(i*7+j-7);            
        guidata(hObject, handles);
    end
end
 
 
Pete

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.11.2007, 20:30     Titel:
  Antworten mit Zitat      
Problem 2 habe ich jetzt mal so gelöst... (for-Schleife zwar weg aber "schön" finde ich das trotzdem nicht).

Code:

handles.x=[handles.Mx(1:7);handles.Mx(8:14);handles.Mx(15:21);handles.Mx(22:28);...
    handles.Mx(29:35);handles.Mx(36:42);handles.Mx(43:49)];
handles.y=480-[handles.My(1:7);handles.My(8:14);handles.My(15:21);handles.My(22:28);...
    handles.My(29:35);handles.My(36:42);handles.My(43:49)];
handles.y=handles.y';
 
 
outsider
Forum-Meister

Forum-Meister


Beiträge: 806
Anmeldedatum: 03.09.07
Wohnort: München
Version: R2012b
     Beitrag Verfasst am: 26.11.2007, 23:33     Titel:
  Antworten mit Zitat      
Hier ist eine elegante Alternative zu den verschachtelten Schleifen.
evtl. musst Du bissl anpassen.
Code:
% zufällig erzeugte vektoren
Mx = rand(1,49);
My = rand(1,49);
% 7x7 Matrix aus Indizes
id = reshape(1:49,7,7);
% Erzeugung von x- und y-Matrizen ganz ohne Schleifen
x = Mx(id');
y = My(id);




MfG
P.S. Man darf nicht unter MATLAB 1x dimensional denken als wenn Du in C programmierst ... Wink MATLAB erlaubt ein N-dimensionales Denken - auch als Vektorization gennant. Wenn man das anwendet kriegt man nicht nur (fast) alle Schleifen aus dem Code weg, sondern bekommt auch einen besseren und verständlicheren und vor allem viel schnelleren Code.
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.