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?
Verfasst am: 05.01.2011, 18:06
Titel: Re: Array aus struct-Objekten
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
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?
"??? 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.
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
ifisequal(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 )
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
ifisequal(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.
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
ifisequal(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!
Einstellungen und Berechtigungen
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
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.