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

Array aus struct-Objekten

 

JAG

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.01.2011, 15:41     Titel: Array aus struct-Objekten
  Antworten mit Zitat      
Hallo,

ich möchte gerne mit Hilfe einer for-Schleife ein Array aus struct-Objekten erzeugen. Hatte es mit einem cell-Array versucht:

Code:

m = cell(size(z-1));
    for zei = 2:z
        x = matrix(zei,:);
        y = soll(zei-1,:);
        p = interp1(x,y,'spline','pp');
        m(zei-1) = p;
    end
 


Allerdings bekomme ich folgende Fehlermeldung: "Conversion to cell from struct is not possible."

Das heißt dann vermutlich, dass ich struct-Objekte nicht in einem cell-Array ablegen kann?!
Muss ich stattdessen ein struct-Array erzeugen? Aber wie kann ich dann da mit einer Schleife meine Elemente ablegen?

Viele Grüße!


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 05.01.2011, 18:06     Titel: Re: Array aus struct-Objekten
  Antworten mit Zitat      
Hallo JAG,

Matlab Sourcecode sieht hübscher aus, wenn Du ihn hier in [ c o d e] und [/ c o d e] (ohne Leerzeichen natürlich) einschließt.

Dein Ansatz ist fast richtig:
Code:
m = cell(size(z-1));
    for zei = 2:z
        x = matrix(zei,:);
        y = soll(zei-1,:);
        p = interp1(x,y,'spline','pp');
        m{zei-1} = p;   % Beachte die geschweiften Klammern!
    end
 

Ebenfalls möglich, aber ein klein wenig langsamer:
Code:
       m(zei-1) = {p};   % Beachte die geschweiften Klammern!
 

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
JAG

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.01.2011, 14:09     Titel:
  Antworten mit Zitat      
Hallo Jan,

vielen Dank für deine schnelle Antwort! Das funktioniert jetzt auch. Allerdings bekomme ich eine neue Fehlermeldung und ich weiß nicht, wie ich mit ihr umgehen soll:
"??? Error using ==> interp1 at 262
The values of X should be distinct."

Ich habe ja eine große Menge an Daten, für die ich jeweils die Funktion interp1 durchführen möchte. Deshalb hab ich probeweise mal eine Datenreihe herrausgenommen und für diese die Funtion ausgeführt. Das hat ohne Probleme funktioniert. Wann ist denn dann mein x nicht eindeutig? Es muss ja wahrscheinlich an irgendeiner der Datenreihen liegen, die keine eindeutigen x-Werte liefert?!? Oder womit kann diese Meldung zusammenhängen?

Viele Grüße, Janine
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 08.01.2011, 00:01     Titel:
  Antworten mit Zitat      
Hallo JAG,

Zitat:
"??? Error using ==> interp1 at 262
The values of X should be distinct."

Wann ist denn dann mein x nicht eindeutig? Es muss ja wahrscheinlich an irgendeiner der Datenreihen liegen, die keine eindeutigen x-Werte liefert?!?

Genau. Mindestens eine Zeile von "matrix" enthält nicht-eindeutige Werte. Exakt das sagt die Fehlermeldung.
Wenn Du nun herausfinden möchtest, welche das ist, kannst Du entweder ein "disp(zei)" einfügen, oder per "dbstop if error" den Debugger dazu auffordern, das Programm anzuhalten, wenn der Fehler auftritt. Dann kannst Du im Command-Window die aktuellen Werte der Variablen untersuchen (UNIQUE!).

UNIQUE mit dem 'rows' Flag würde auch beim Suchen helfen.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Janine
Forum-Anfänger

Forum-Anfänger


Beiträge: 20
Anmeldedatum: 07.01.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.01.2011, 19:16     Titel:
  Antworten mit Zitat      
Danke für den Tipp, jetzt weiß ich wenigstens, dass ich teilweise mehrere gleiche Werte in meinem x-Vektor stehen habe. Deshalb hab ich versucht, bevor ich mein Programm die Funktion p = interp1(x,y,'spline','pp') ausführen lasse, zu prüfen, ob sich gleiche Zahlen im Vektor befinden und wenn ja, einen der beiden Werte um 1 zu erniedrigen, damit sie sich unterscheiden.
Hier der Code:

Code:
m = cell(size(z-1));
    for zei = 2:z
        x = matrix(zei,:);
        for n = 1:s-1
            l = n+1;
            for k = l:s
                if isequal(matrix(zei,n), matrix(zei,k))
                    matrix(zei, k)= matrix(zei,k)-1;
                end
            end
        end
        y = soll(zei-1,:);
        disp(zei);
        p = interp1(x,y,'spline','pp');
        m{zei-1} = p;
    end


Allerdings will das Programm leider immer noch nicht so, wie ich das gerne hätte. Ich finde nur dummerweise nicht worin mein Fehler liegt. Kann man den Vergleich noch eleganter machen, als ich es mit den for-Schleifen versucht habe? Habe auch überlegt, ob es mit unique besser funktioniert, hatte dazu aber keine Idee...
Ich hoffe mir kann nochmal jemand helfen!

Viele Grüße, Janine

(Ich hab mich inzwischen angemeldet: JAG bin ich Wink )
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: 11.01.2011, 23:31     Titel:
  Antworten mit Zitat      
Hallo Janine,

Mir wird nicht klar, was Dein Programm bewirken soll.
Viele Dingen beliben unklar:
Code:
m = cell(size(z-1));   % meinst Du "size(z)-1"??
for zei = 2:z             % Was ist "z"?
   x = matrix(zei,:);
   for n = 1:s-1   % Was ist "s"?
       l = n+1;
       for k = l:s  
           if isequal(matrix(zei,n), matrix(zei,k))
               matrix(zei, k)= matrix(zei,k)-1;
           end
       end
   end
   % Jetzt ist "matrix" mit viel Aufwand verändert worden
   % Dabei wird es nun gar nicht mehr verwendet?!
   y = soll(zei-1,:);  % Was ist "soll"?
   disp(zei);
   p = interp1(x,y,'spline','pp');
   m{zei-1} = p;
end

Ich habe zwar den Eindruck, dass sich das Ergebnis deutlich effizienter lösen lassen könnte. Aber solange ich nicht genau verstehe, was das Programm berechnen soll, wären Ratschläge nur wildes spekulieren.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Janine
Forum-Anfänger

Forum-Anfänger


Beiträge: 20
Anmeldedatum: 07.01.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.01.2011, 16:00     Titel:
  Antworten mit Zitat      
Ohja, du hast vollkommen Recht, dass einiges unklar ist bzw. dass ich ein paar Fehler gemacht habe, die natürlich verwirrend sind. Tut mir leid!

Code:
m = cell(1, z-1); % Hier gehört kein size() hin und "z" sowie "s" wurde schon weiter oben ein Zahlenwert zugewiesen
    for zei = 2:z
        for n = 1:s-1
            l = n+1;
            for k = l:s
                if isequal(matrix(zei,n), matrix(zei,k))
                    matrix(zei, k)= matrix(zei,k)-1;
                end
            end
        end
        x = matrix(zei,:); % Ich hab die Schleife wegen einem Denkfehler eine Zeile zu weit unten eingefügt. Hier wird x die veränderte Matrix zugewiesen.
        y = soll(zei-1,:); % "soll" ist eine Matrix, die auch weiter oben festgelegt wurde
        disp(zei);
        p = interp1(x,y,'spline','pp');
        m{zei-1} = p;
    end


Dank deiner Fragen, wodurch ich 2 Fehler bemerkt habe, funktioniert dieser Teil von meinem Programm jetzt auch.
Ist jetzt klarer geworden, was mein Ziel ist? Ich möchte in einem Array eine Reihe von Splines ablegen.
"m" ist übrigens der Rückgabewert meiner Funktion. Wenn ich jetzt allerdings auf Elemente aus "m" zugreifen möchte, um diese dann mit "ppval" auszuwerten, muss ich sie doch bestimmt noch casten, weil es ein cell-Array ist, oder?!?

Danke und lg!
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.