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

Minimalbeispiel gibt Fehlerneldung aus

 

meganoob
Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 13.11.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.12.2012, 15:34     Titel: Minimalbeispiel gibt Fehlerneldung aus
  Antworten mit Zitat      
Ich möchte lernen wie man ein Video erstellt und wollte anhand eines laufenden Minimalbeispiels mich hoch arbeiten zu meinem eigentlich gewünschten Video. Leider klappt selbst das Minimalbeispiel nicht.

Ich bin auf File- New - Script gegangen und hab folgenden Code eingetippt:

Code:

for j=1:100
          plot(1,sin(0.01*j),'o')
          M(j) = getframe;
end
movie(M)


Nun erscheint folgende Fehlermeldung:


??? The following error occurred converting from struct to double:
Error using ==> double
Conversion to double from struct is not possible.

Error in ==> videominimalbeispiel at 4
M(j) = getframe;
Private Nachricht senden Benutzer-Profile anzeigen


dmjr
Forum-Century

Forum-Century


Beiträge: 199
Anmeldedatum: 02.10.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.12.2012, 16:18     Titel:
  Antworten mit Zitat      
Vermutlich ist M bereits als double initalisiert.
Versuch es mal mit:

Code:
clear M
for j=1:100
          plot(1,sin(0.01*j),'o')
          M(j) = getframe;
end
movie(M)
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: 25.12.2012, 18:34     Titel: Re: Minimalbeispiel gibt Fehlerneldung aus
  Antworten mit Zitat      
Hallo meganoob,

Hier hilft wie so oft der Debugger weiter:
Code:

Dann stoppt Matlab sowie der Fehler erreicht wird. Nun:
Code:

Was erhälst Du? Lässt sich die Ausgabe von GETFRAM in "M(j)" speichern?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
meganoob
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 13.11.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.12.2012, 01:03     Titel:
  Antworten mit Zitat      
Mit diesem clear M hat es nun funktioniert. Deshalb kam ich gar nicht mehr dazu das andere zu testen, also erstmal danke an euch beide. Ich melde mich sicher schon bald mit anderen Problemen.
Private Nachricht senden Benutzer-Profile anzeigen
 
meganoob
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 13.11.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.12.2012, 04:36     Titel:
  Antworten mit Zitat      
Nächste Frage: Wie krieg ich es hin, dass die Achsen für alle Bilder des Videos gleich bleiben?

Sowohl mit
Code:
AXIS([XMIN XMAX YMIN YMAX])
als auch mit

Code:
set(gca,'nextplot','replacechildren');
hat es nicht funktioniert.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 26.12.2012, 13:53     Titel:
  Antworten mit Zitat      
Hallo,

mit ersterem sollte es funktionieren, sofern es an die richtige Stelle (unmittelbar vor getframe) gesetzt wird. Bitte den relevanten Code posten.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
meganoob
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 13.11.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.01.2013, 06:05     Titel:
  Antworten mit Zitat      
Ok, ich hab nun versucht dieses Minimalbeispiel in meine eigentliche AUfgabe zu integrieren, hier das Ergebnis:


Code:
% Quadratische Suche
% Die Funktion, hier sinc, sowie die Intervallgrenzen a und b werden im
% Command Window gewählt. Die beiden Endpunkte des Intervalls sowie der
% Mittelpunkt dienen als Startpunkte.
clear M
a=2/5;
b=2 ;
x=[ b (a+b)/2 a];
% Nun wird die Funktion an den Startpunkten ausgewertet.
for j=1:10
y=sinc(x) ;
% Im nächsten Schritt werden die dividierten Differenzen der
% Newtondarstellung berechnet und in einer Matrix DD gesammelt.
% In der ersten Spalte werden die Stützstellen gespeichert.
DD(1:length(x),1)=x ;
% In der zweiten Spalte werden die Funktionswerte an den Stützstellen
% gespeichert.
DD(1:length(y),2)=y ;
% In der dritten Spalte stehen die dividierten Differenzen in denen zwei
% aufeinanderfolgende Stützstellen verbaut wurden, in der vierten Spalte
% jene, in denen alle drei verbaut wurden.
for k=1:2
    DD(k,3)=(DD(k+1,2)-DD(k,2))/(DD(k+1,1)-DD(k,1));
end
for k=1
 DD(k,4) = (DD(k+1,3)-DD(k,3))/(DD(k+2,1)-DD(k,1));
end  
% Jetzt wird das Minimum der Parabel berechnet und ein Schaubild mit
% der Funktion und der Parabel geplottet.
x(4)=0.5*(x(1)+x(2)-(DD(1,3)/DD(1,4))) ;
q=linspace(a,b) ;
w= [ sinc(q) ; DD(1,4).*(q-x(1)).*(q-x(2))+DD(1,3).*(q-x(1))+DD(1,2)] ;
s=x(4);  % Das Minimum der Parabel im Schaubild markieren
d=sinc(x(4)) ;
plot(q,w,s,d,'o');
axis([a b -0.3 0.7])
M(j)=getframe;
% Die Stützstelle mit dem niedrigsten Index fällt raus damit es wieder
% drei Stützstellen sind.
x(1)=[] ;
end
movie(M,1,0.5)


Es gibt nun aber mehrere Probleme:

1. Der Film läuft nicht direkt in der geforderten Geschwindigkeit ab, sondern ersteinmal sehr schnell, wie krieg ich das weg?

2. Die Achsenbeschriftung ist hier manuell vorgenommen worden, ich möchte aber, dass diese sich automatisch je nach Funktion sinnvoll ergibt.
Wie krieg ich das hin?

3. Wie kann ich in die einzelnen Bilder noch eine Legende einfügen, die erklärt was, was ist?

Falls es jemand selber mal laufen lassen will braucht er noch die sinc funktion

Code:
function [ z ] = sinc( x )
%UNTITLED8 Summary of this function goes here
%   Detailed explanation goes here

 if x==1
    z=0 ;
   
 else
z= sin((pi./x))./(pi ./x);

 

end
 
Private Nachricht senden Benutzer-Profile anzeigen
 
meganoob
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 13.11.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.01.2013, 23:23     Titel:
  Antworten mit Zitat      
Helft mir doch Sad

Falls was dumm beschrieben ist oder so, dann fragt nochmal nach.
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: 13.01.2013, 23:36     Titel:
  Antworten mit Zitat      
Hallo meganoob,

Es ist Wochenende. Natürlich machen auch mal die Antwortenden mal Pausen. Drängeln ist nicht hilfreich, um Leuten zu motivieren, die in ihrer Freizeiz freiwillig und unentgeltlich helfen.

Zitat:
1. Der Film läuft nicht direkt in der geforderten Geschwindigkeit ab, sondern ersteinmal sehr schnell, wie krieg ich das weg?

Stimmt. Zunächst werden die Bilder erzeugt so schnell wie möglich, danach wird das Movie mit der eingestellten Geschwindigkeit abgespielt. Bei Bedarf könnte ein PAUSE-Befehl hilfreich sein, um auch die Erstellung zu verlangsamen.

Zitat:
2. Die Achsenbeschriftung ist hier manuell vorgenommen worden, ich möchte aber, dass diese sich automatisch je nach Funktion sinnvoll ergibt.

Was bedeutet "sinnvoll ergibt" hier? Das lässt sich weder für Matlab noch für uns erraten.

Zitat:
3. Wie kann ich in die einzelnen Bilder noch eine Legende einfügen, die erklärt was, was ist?

Mit dem LEGEND-Befehl?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
meganoob
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 13.11.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.01.2013, 17:45     Titel:
  Antworten mit Zitat      
Die Tipps waren schon ziemlich fett. Aber ich hab noch weitere Fragen.
Zu den Achsen:

Ich hätte gerne, dass die Achsen immer so bleiben wie sie im ersten Bild meiner Sequenz von matlab automatisch eingestellt worden sind. Wie mach ich das?


2. Ist es möglich in den Bildern einen Counter sichtbar zu machen, der anzeigt das wievielte Bild gerade zu sehen ist?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 22.01.2013, 20:05     Titel:
  Antworten mit Zitat      
Hallo,

beim ersten Bild mit AXIS abfragen, welche Einstellungen MATLAB gewählt hat. Bei den weiteren Bildern, wieder mit AXIS, auf das selbe Bild setzen.

Den Zähler kannst du z.B. mit TITLE einbauen oder auch mit TEXT, je nachdem wo in dem Bild der Zähler sein soll.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Thomas84
Forum-Meister

Forum-Meister


Beiträge: 546
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.01.2013, 08:20     Titel:
  Antworten mit Zitat      
Abgesehen von den anderen Problemen finde ich deine sinc Funktion etwas komisch. Sie entspricht zum einen nicht der Definition der sinc Funktion (http://de.wikipedia.org/wiki/Sinc-Funktion) und zum anderen müsste es

Code:

if x == 0
z = 0
else
...
end
 


lauten um die Division durch Null abzufangen.

viele Grüße
Thomas
Private Nachricht senden Benutzer-Profile anzeigen
 
meganoob
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 13.11.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.01.2013, 09:46     Titel:
  Antworten mit Zitat      
@Thomas

Ich hab eben zwei Funktionen gefunden, die sinc(x) heißen. Einmal:

sin(x)/x und sin(pi*x)/pi*x


In meiner Aufgabenstellung wurde dann sinc(pi/x) verwendet. Ich habe also in der ersten sinc funktion x durch pi/x ersetzt.

Aber ich habe nun Funktion und Datei umbenannt zu bspfunc

Code:
function [ z ] = bspfunc( x )
%UNTITLED8 Summary of this function goes here
%   Detailed explanation goes here


 
   if x==0
      z=0 ;      
   else
  z= sin((pi./x))./(pi ./x); %Die Beispielfunktion aus der Aufgabenstellung


 % z=2*sin(x)+x ; % eigene Beispielfunktion, I=[3 6]


 % z=x.^5.*cos(x)+cos(x); % zweite eigene Beispielfunktion, I=[3,5]
 
 % z=exp(x)-x ; % I=[-1,1]
 
 % z=-sin(x).*cos(x).*exp(x) ;% I=[0,2]


end
 


@Harald, das mit den Achsen hab ich nun hinbekommen, aber es ist nicht wirklich elegant. Ich hab einfach das erste Bild aus der Schleife genommen, die Achsen gespeichert und dann diesen gespeicherten Wert in eigentliche Schleife wieder eingebaut.

Wie ich Text einfüge weiß ich nun aber ich kapier nicht wie ich einen Laufindex in den Text einfüge.

Code so far:


Code:
% Quadratische Suche
% Die Funktion, hier bspfunc, wird in einer seperaten Datei definiert.
% Die beiden Endpunkte des Intervalls sowie der Mittelpunkt dienen als
% Startpunkte.
clear M %anlegen der Matrix für den Film
clear fff %
a=2/5;  % Intervallgrenzen müssen je nach Funktion hier eingegeben werden
b=2 ;
x=[ b (a+b)/2 a];

for j=1:1 % Schleife zur Erstellung der Bildersequenz. Wenn man hier eine
    % zu hohe Zahl wählt gibt es Probleme, da dann bei der Berechnung der
    % dividierten Differenzen irgendwann 0/0 berechnet wird, da  "nur" mit
    % 16 Dezimalstellen rechnet.
y=bspfunc(x) ; % Nun wird die Funktion an den Startpunkten ausgewertet.
% Im nächsten Schritt werden die dividierten Differenzen der
% Newtondarstellung berechnet und in einer Matrix DD gesammelt.
% In der ersten Spalte werden die Stützstellen gespeichert.
DD(1:length(x),1)=x ;
% In der zweiten Spalte werden die Funktionswerte an den Stützstellen
% gespeichert.
DD(1:length(y),2)=y ;
% In der dritten Spalte stehen die dividierten Differenzen in denen zwei
% aufeinanderfolgende Stützstellen verbaut wurden, in der vierten Spalte
% jene, in denen alle drei verbaut wurden.
for k=1:2
    DD(k,3)=(DD(k+1,2)-DD(k,2))/(DD(k+1,1)-DD(k,1));
end
for k=1
 DD(k,4) = (DD(k+1,3)-DD(k,3))/(DD(k+2,1)-DD(k,1));
end  
% Jetzt wird das Minimum der Parabel berechnet und ein Schaubild mit
% der Funktion und der Parabel geplottet.
x(4)=0.5*(x(1)+x(2)-(DD(1,3)/DD(1,4))) ;
q=linspace(a,b) ;
w= [ bspfunc(q) ; DD(1,4).*(q-x(1)).*(q-x(2))+DD(1,3).*(q-x(1))+DD(1,2)] ;
s=x(4);  % Das Minimum der Parabel im Schaubild markieren
d=bspfunc(x(4)) ;
plot(q,w,s,d,'o');
title('Quadratische Suche');
legend({'zu minimierende Funktion','interpolierende Parabel','Minimum der Parabel'},'Location','EastOutside')
axis  ;
fff=axis ; % die Achseneinstellung speichern damit das Koordinatensystem
% gleich bleibt
M(j)=getframe;
% Die Stützstelle mit dem niedrigsten Index fällt raus damit es wieder
% drei Stützstellen sind.
x(1)=[] ;
pause(2)
end

for j=2:10 % Diesen Split in zwei for Schleifen hab ich gemacht weil ich
    % anders das mit der Beibehaltung des Koordinatensystems nicht hin-
    % bekommen habe.
y=bspfunc(x) ; % Nun wird die Funktion an den Startpunkten ausgewertet.
% Im nächsten Schritt werden die dividierten Differenzen der
% Newtondarstellung berechnet und in einer Matrix DD gesammelt.
% In der ersten Spalte werden die Stützstellen gespeichert.
DD(1:length(x),1)=x ;
% In der zweiten Spalte werden die Funktionswerte an den Stützstellen
% gespeichert.
DD(1:length(y),2)=y ;
% In der dritten Spalte stehen die dividierten Differenzen in denen zwei
% aufeinanderfolgende Stützstellen verbaut wurden, in der vierten Spalte
% jene, in denen alle drei verbaut wurden.
for k=1:2
    DD(k,3)=(DD(k+1,2)-DD(k,2))/(DD(k+1,1)-DD(k,1));
end
for k=1
 DD(k,4) = (DD(k+1,3)-DD(k,3))/(DD(k+2,1)-DD(k,1));
end  
% Jetzt wird das Minimum der Parabel berechnet und ein Schaubild mit
% der Funktion und der Parabel geplottet.
x(4)=0.5*(x(1)+x(2)-(DD(1,3)/DD(1,4))) ;
q=linspace(a,b) ;
w= [ bspfunc(q) ; DD(1,4).*(q-x(1)).*(q-x(2))+DD(1,3).*(q-x(1))+DD(1,2)] ;
s=x(4);  % Das Minimum der Parabel im Schaubild markieren
d=bspfunc(x(4)) ;
plot(q,w,s,d,'o');
title('Quadratische Suche');
legend({'zu minimierende Funktion','interpolierende Parabel','Minimum der Parabel'},'Location','EastOutside')
text((a+b)/2,0,'hallo')
axis([fff]) ; % Festsetzung der Achsen, so wie matlab sie automatisch für
% das erste Bild erstellt hat
M(j)=getframe;
% Die Stützstelle mit dem niedrigsten Index fällt raus damit es wieder
% drei Stützstellen sind.
x(1)=[] ;
pause(2)
end

% movie(M,1,0.5)   %Den Film braucht man nun doch nicht, da die Bilder-
 %sequenz ohnehin abgespielt wird. Aber man kann ihn abspielen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 23.01.2013, 13:55     Titel:
  Antworten mit Zitat      
Hallo,

wenn die Veränderungen zwischen j=1 und j>1 relativ gering sind, kann man das vielleicht über eine if-Abfrage in einer Schleife machen, ohne j=1 komplett separat zu behandeln.

Wenn k eingefügt werden soll:
Code:
text((a+b)/2,0,['hallo ' num2str(k)])


Grüße,
Harald
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.