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 im ws anhand Index aufrufen

 

TMIMLER

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.10.2013, 17:58     Titel: Variablen im ws anhand Index aufrufen
  Antworten mit Zitat      
Hallo Zusammen,

ich mache gerade meine ersten Schritte in Sachen Matlabprogrammierung und habe folgendes Problem.

Ich habe mir in Matlab eine Latte an Variablen mit einem Namen berechnet, der wie folgt aussieht:

B_SCH_drehzahl(1,1)xdrehzahl(1,2)_last(1,1)xlast(1,2)

Die Größen für Drehzahl und Last kommen aus jeweils einem Eingangsvektor. Das hat bis jetzt wie geplant funktioniert.
Als nächsten Schritt möchte ich jede dieser Variablen durch eine andere teilen, um so auf eine weitere Variable zu kommen. Ich dachte mir, das einfachste wäre dies in einer for-Schleife zu machen, derren Schleifenanzahl sich an der Größe der Eingangsvektoren orientiert. Denn genau so viele Ergebnisse sollen da ja immer rauskommen
Nun zu meinem Problem:
Ich scheitere gerade daran, die Variablen im Workspace anhand der Drehzahlinfo und Lastinfo anzusprechen.
So ähnlich stelle ich mir das in etwa vor:

Eingangsvektoren:

sch_drehzahl = [500,1000,1500,2000,2500,3000,3500];
sch_last = [0,5,10,15,20,25,30];


for x = 1 : (length(drehzahl)-1);
for y = 1 : (length(last)-1);

Ergebnis_drehzahl(1,x)xdrehzahl(1,x+1)_last(1,y)xlast(1,y+1) =
B_SCH_drehzahl(1,x)xdrehzahl(1,x+1)_last(1,y)xlast(1,y+1) / B_SCH_gesamt;

end
end

Die Bezeichnungen der Ergebnisse sollen natürlich auch die entsprechende Drehzahl- und Lastinfo haben.
Ich hoffe mein Problem halbwegs verständlich erläutert zu haben und hoffe jemand hat hierfür eine Lösung. Unterm Strich ist denke ich mein Problem, die Variablen im WS über Indexierung anzusprechen und weiterzuverarbeiten. Vorab vielen Dank!

MFG TMIMLER


Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 18.10.2013, 08:15     Titel:
  Antworten mit Zitat      
Punkt 1: Eine solche Syntax gibt es nicht in MATLAB:

Code:

A=1;
B=2;
A(1,1)B(1,1)
 A(1,1)B(1,1)
       |
Error: Unexpected MATLAB expression.
 


Was ist tatsächlich der ausführbare Code?

Punkt 2: Könnte es sein, dass es hier um Interpolation geht?

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
TMIMLER

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.10.2013, 08:43     Titel:
  Antworten mit Zitat      
Hallo Andreas,

das die Syntax nicht funktioniert ist mir klar, deswegen suche ich ja hier nach Hilfe.
Mein Problem ist, die vorher erzeugten Variablen allgemein mit Hilfe der Inhalte der Eingangsvektoren (also Last und Drehzahl) anzusprechen, um diese dann weiterzuverarbeiten. Um Interpolation geht es hier meiner Meinung nach nicht.

Danke und Gruß
 
BlackDread
Forum-Century

Forum-Century


Beiträge: 212
Anmeldedatum: 11.05.11
Wohnort: ---
Version: 2015a
     Beitrag Verfasst am: 18.10.2013, 08:52     Titel:
  Antworten mit Zitat      
Hallo TMIMLER,

wenn du die Variablen selbst erstellen kannst, warum nutzt du nicht lieber Cell Arrays oder Structs mit dynamic field names? Ich nehme an du hast die Variablen mit eval/assign erstellt?
Daran wo du gerade hängst sind genau die Dinge wovor bei eval/assign immer gewarnt wird (zumindestens hier im Forum). Falls du das wirklich so fortführen willst, bleibt dir wohl nur wieder ein kompliziertes eval-Konstrukt, das wieder eval-Konstrukte nach sich zieht und am Ende kaum mehr verstehbar ist.

Viele Grüße
Chris
Private Nachricht senden Benutzer-Profile anzeigen
 
TMIMLER

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.10.2013, 10:14     Titel:
  Antworten mit Zitat      
Hallo BlackDread,

du hast es erkannt. Ich habe die Variablen mit assignin erzeugt.
Ich hatte gerade auch den Gedankengang, dass ich vll lieber die Ergebnisse direkt in der Schleife stückchenweise in ein Structurearray schreibe. Ich denke, dass ist der bessere Weg, nur macht es das für mich an der Stelle nicht gerade einfacher, da ich mir nicht sicher bin, wie das im Detail umgesetzt wird...Hierzu muss ich mich noch mehr in das Thema Structure und Dynamic Field Names einlesen.

Danke und Gruß
TMIMLER
 
Kascho
Forum-Century

Forum-Century


Beiträge: 195
Anmeldedatum: 24.03.10
Wohnort: Jena
Version: R2008b ... :(
     Beitrag Verfasst am: 18.10.2013, 10:27     Titel:
  Antworten mit Zitat      
hallo TMIMLER,
schau dir in diesem Zusammenhang auch
Code:

an. Finde ich persönlich einfacher zu handhaben.

Gruß, Kascho
Private Nachricht senden Benutzer-Profile anzeigen
 
TMIMLER

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.10.2013, 10:51     Titel:
  Antworten mit Zitat      
Danke für den Tipp!

Egal ob ich das jetzt über Cell oder Struct-Arrays lösen werde, brauche ich ja für die Indexierung den jeweiligen Schleifendurchlauf der doppel For-Schleife. Hab jetzt schon ausführlich gegoogelt, aber leider finde ich keine Lösung für das scheinbar einfache Problem. Habt ihr eine Idee?

Vorab vielen Dank!

MFG
TMIMLER
 
Kascho
Forum-Century

Forum-Century


Beiträge: 195
Anmeldedatum: 24.03.10
Wohnort: Jena
Version: R2008b ... :(
     Beitrag Verfasst am: 18.10.2013, 10:57     Titel:
  Antworten mit Zitat      
Hi nochmal, so richtig wird mir nicht klar was du machen möchtest. Erklär bitte nochmal:
Was ist dein Eingang, was willst du berechnen und was willst du als Ergebnis?
Am besten (lauffähiger) code als minimalbeispiel.

Gruß, Kascho
Private Nachricht senden Benutzer-Profile anzeigen
 
TMIMLER

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.10.2013, 11:15     Titel:
  Antworten mit Zitat      
Okay, ich versuchs nochmal. Ich erzeuge mir eine Latte an Signalen über folgende Doppel-for-Schleife. Das funktioniert auch soweit:

Code:


sch_drehzahl = [500,1000,1500,2000,2500,3000,3500];
sch_last = [0,5,10,15,20,25,30];

hos_drehzahl =[500,1000,1500,2000,2500,3000,3500];
hos_last =[0,10,20,30,40,50,60];

for x = 1 : (length(sch_drehzahl)-1);                                                                                   % Länge der Eingangsvektoren -1, da unten die Drehzahl/- lastfenster abgefragt werden
    for y = 1 : (length(sch_last)-1);                                                                                   % Länge der Eingangsvektoren -1, da unten die Drehzahl/- lastfenster abgefragt werden
                           
        Indice = [];                                                                                                    % "Resetierung" der Variable Indice
        Indice = find(bdemod == 40 & nmot_w >= sch_drehzahl(1,x) & nmot_w < sch_drehzahl(1,x+1) ...
            & miist_w >= sch_last(1,y) & miist_w < sch_last(1,y+1));                                                    % Abfrage der Größen, bei Drehzahl und Last werden die Vektoreninhalt abgefragt und
                                                                                                                        % für die Schleife variablen dargestellt
       
        SCH_Vektor= [];                                                                                                 % "Resetierung" des Vektors
        SCH_Vektor(Indice) = 1;                                                                                         % Erstellung des Vektors mit einer 1 an der zutreffenden Indexposition
        assignin('base',['B_SCH_' num2str(sch_drehzahl(1,x)) 'x' num2str(sch_drehzahl(1,x+1)) '_' ...
            num2str(sch_last(1,y)) 'x' num2str(sch_last(1,y+1))],SCH_Vektor);                                           % Variabler Vektorname inkl. der Last- und Drehzahlinfo für die Schleife
       
        SCH_Vektor_fertig=(sum(SCH_Vektor)*0.1);                                                                        % Aufsummierung der 1er zu einer Gesamtzeit
        assignin('base',['B_SCH_fertig_' num2str(sch_drehzahl(1,x)) 'x' num2str(sch_drehzahl(1,x+1)) '_' ...
            num2str(sch_last(1,y)) 'x' num2str(sch_last(1,y+1))], ...          
            SCH_Vektor_fertig);                                                                                         % Variabler Name inkl. der Last- und Drehzahlinfo für die Schleife
           
       
    end
end

 


Um jetzt das Ergebnis jedes Schleifendurchlaufs in ein Cell oder Scruct-Array zu schreiben, benötige ich ja zur Indexierung die Anzahl des aktuellen Schleifendurchlaufs.

Danke und Gruß
 
Sirius3
Forum-Guru

Forum-Guru


Beiträge: 441
Anmeldedatum: 12.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.10.2013, 20:10     Titel:
  Antworten mit Zitat      
Hallo TMIMLER,

was willst Du überhaupt mit dem SCH_Vektor anfangen?
Du verwendest »find« um aus einem logischen Vektor Indizes zu finde um danach wieder einen pseudo-logischen Vektor zu erzeugen???
Das "Resetten" von Vektoren ist seltsam, und im ersten Fall auch überflüssig. Deine ganzen Kommentare sind nutzlos, da sie nur das kommentieren, was in der Zeile sowieso schon steht.
»x« und »y« als Schleifenvariablen sind ungewöhlich, da der Leser reele Zahlen damit verbindet und keine Indizes. Nimm a,b oder n,m.
Du hast eine Größe, die von zwei Parametern abhängt, dann mach daraus eine Matrix. Spalten. und Zeilennummer der Matrix sind dann je mit Drehzahl bzw. Last verknüpft. Diese Information brauchst Du Dir also nicht zusätzlich merken.
Code:

sch_drehzahl = [500,1000,1500,2000,2500,3000,3500];
sch_last = [0,5,10,15,20,25,30];

SCH_indices = cell(length(sch_drehzahl)-1,length(sch_last)-1);
SCH_fertig = zeros(length(sch_drehzahl)-1,length(sch_last)-1);

mask_bdemod = bdemod==40;
for a = 1:(length(sch_drehzahl)-1)
    mask_drehzahl = nmot_w >= sch_drehzahl(a) & nmot_w < sch_drehzahl(a+1);
    for b = 1:(length(sch_last)-1)
        mask_last = miist_w >= sch_last(b) & miist_w < sch_last(b+1);
        indices = mask_bdemod & mask_drehzahl & mask_last;
        SCH_indices{a,b} = indices;
        SCH_fertig(a,b) = sum(indices)*0.1;
    end
end


Grüße
Sirius
Private Nachricht senden Benutzer-Profile anzeigen
 
TMIMLER

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.10.2013, 14:33     Titel:
  Antworten mit Zitat      
Hallo Sirius,

vielen Dank für deine Hilfe! Du hast mein Problem erfasst und mir direkt einen super Verbesserungsvorschlag geben, den ich so 1:1 anwenden werde!

Gruß
 
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.