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

Eine Gerade im Plot oder aus Daten ermitteln/erkennen

 

phantomas_81
Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 12.09.11
Wohnort: Bielefeld
Version: 2011a
     Beitrag Verfasst am: 23.09.2011, 08:29     Titel: Eine Gerade im Plot oder aus Daten ermitteln/erkennen
  Antworten mit Zitat      
Hallo,

bin auf ein (für einige hier wahrscheinlich kleines Problem) gestoßen;-)

ich lasse mir Messdaten im plot (x,y) darstellen, als Beispiel ein Viereck welches mit einem Sensor eingemessen wurde.
Da die Daten etwas Schwanken filtere ich sie mittels filtfilt bereits beim einlesen in MatLab. Leider unterliegen diese Daten danach immer noch einer Schwankung.
Jetzt habe ich Aufgabenstellung erhalten aus den Daten bzw. den Plot jeweils immer die Gerade zu erkennen und durch eine Ideale Gerade zu ersetzen.
Ist es möglich dies aus dem Plot oder aus den Daten zu erkennen?
Stehe auf dem Schlauch.... Sad
Die Messpunkte bestehen aus (x,y), bzw. die reinen Messdaten aus (winkel,R)
diese habe ich dann immer in x,y gerechent um sie im kartesischen System darzustellen
_________________

Gruß Jan
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: 23.09.2011, 08:55     Titel: Re: Eine Gerade im Plot oder aus Daten ermitteln/erkennen
  Antworten mit Zitat      
Hallo phantomas_81,

Einen Fit würde ich auf die ungefilterten Daten anwenden, es sei denn, ich habe sehr gute physikalische Gründe für einen Filter. Z.B. ein 50Hz-Rauschen durch die Netzfrequenz zu entfernen ist valide, dafür sollte die Bandbreite des Filters aber auch unbedingt physikalisch motiviert sein.

Eine Gerade kann man sehr gut mit POLYFIT in die Daten legen, solange keine mehrfachen Datenwerte auftreten. Das "Basic fitting" Menü ist eine sehr schnelle Art, das durchzuführen.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 12.09.11
Wohnort: Bielefeld
Version: 2011a
     Beitrag Verfasst am: 23.09.2011, 08:59     Titel:
  Antworten mit Zitat      
HI danke für die schnelle Antwort!

Wie kann ich das denn so einpflegen das es mein "Programm" selbstständig erkennt ob eine Gerade vorliegt oder nicht?
Das Programm soll die Daten einlesen und erkennen ob es Geraden in einer Kontur gibt oder nicht, diese wenn vorhanden durch ideale Geraden ersetzen?
MEin Problem liegt darin dieses zu erkennen
_________________

Gruß Jan
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: 23.09.2011, 11:03     Titel:
  Antworten mit Zitat      
Hallo phantomas_81,

Dafür gibt es keine eindeutige Definition. Man kann ein Polynom vom Grad 3 fitten und schauen of die Steigung und Krümmung unter einer gewissen Grenze liegt. Mann kann testen, ob das per FFT bestimmte Frequenz-Spektrum dem erwarteten Rauschen entspricht. Man kann den RMS-Unterschied zwischen dem Signal und einem gefilterten Signal bestimmen.
Selbst mit dem Auge lassen sich Geraden manchmal schnell erkennen, aber man kann auch ganz falsch liegen.
Code:
plot(0:10, (0:10) .^ 2);
pause(2);
ylim([-2000, 2000]);

Ob eine Linie "gerade" ist, kann also an der Skalierung liegen. das gleiche gilt für einen "Knick": Obwohl man das im Normalfall so leicht visuell zu erkennen glaubt, ist es informationstechnisch nicht definierbar. Es hängt z.B. davon ab, ob man die Messdaten in Meter oder Nanometer speichert.

Wie ist "gerade" also in Deinem Problem physikalisch definiert?

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 12.09.11
Wohnort: Bielefeld
Version: 2011a
     Beitrag Verfasst am: 23.09.2011, 11:43     Titel:
  Antworten mit Zitat      
in meinem Fall ist Gerade die Oberfläche eines glatten Werkstücks.
Der Sensor allerdings, mit dem das Werkstück gemessen wird, liefert schwankende Werte(Messgenauigkeit, Std-Abweichung etc.). Wenn ich also die Kontur dieses Werkstückes messe, erhalte ich zwar die Kontur aber nicht exakt. Dort wo das Werkstück gerade ist, bekomme ich zwar annähernd eine Gerade aber durch größerem skalieren sehe ich ntürlcih Schwankungen. Ich möchte also die Schwankungen die dort eigentlich nicht sind eleminieren und mit einer Idealen Geraden ersetzen
_________________

Gruß Jan
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: 23.09.2011, 13:42     Titel:
  Antworten mit Zitat      
Hallo phantomas_81,

Dann brauchst Du einfach den Mittelwert aus Deiner Messung? Oder ein POLYFIT mit einer Geraden? Ist die ganze Messung durch eine Gerade zu fitten, oder musst Du auch den Abschnitt bestimmen, in denen die messung gerade sein soll?

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 12.09.11
Wohnort: Bielefeld
Version: 2011a
     Beitrag Verfasst am: 26.09.2011, 10:29     Titel:
  Antworten mit Zitat      
Hallo, ja den Abschnitt muss ich auch bestimmen.
Da ich als Beispiel ein Quadrat einmesse, die Seiten des quadrats sollen dann durch eine ideale Gerade ersetzt werden. Die Ecken sollen natürlich nicht ersetzt werden.Wink
Bisher habe ich es soweit das ich mir Richtungsvektoren berechne, zwischen den einzelnen Messpunkten. Hieraus erhalte ich zu jeder Seite des quadrats schon mal die Richtung der Messpunkte. das klappt auch soweit ganz gut.
Jetzt möchte ich die Messreihe durchsuchen und überprüfen wo die richtung identisch ist. dann den ersten und den letzten punkt ermittelten und hier durch eine gerade zeichnen. bzw die Messpunkte durch die neuen ersetzen. Das durchsuchen der Messpunkte möchte ich natürlich mit einer gewissen toleranz machen, sonst erhalte ich ja nicht wirklich viel gleiche winkel aufgrund der schwankungen;-)
_________________

Gruß Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
phantomas_81
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 12.09.11
Wohnort: Bielefeld
Version: 2011a
     Beitrag Verfasst am: 26.09.2011, 10:34     Titel:
  Antworten mit Zitat      
Ps: mal was anders ich habe anscheinend aus versehen eine funktion gelöscht erhalte immer beim starten des Programms sowie beim skalieren des fensters folgenden Fehler:
Code:

??? Error using ==> feval
Undefined function or method 'figure1_ResizeFcn' for input arguments of type 'struct'.

Error in ==> gui_mainfcn at 96
        feval(varargin{:});

Error in ==> Benutzeroberflaeche at 59
    gui_mainfcn(gui_State, varargin{:});

Error in ==>
@(hObject,eventdata)Benutzeroberflaeche('figure1_ResizeFcn',hObject,eventdata,guidata(hObject))

 
??? Error using ==> drawnow
Error while evaluating figure ResizeFcn

??? Error using ==> feval
Undefined function or method 'figure1_ResizeFcn' for input arguments of type 'struct'.

Error in ==> gui_mainfcn at 96
        feval(varargin{:});

Error in ==> Benutzeroberflaeche at 59
    gui_mainfcn(gui_State, varargin{:});

Error in ==>
@(hObject,eventdata)Benutzeroberflaeche('figure1_ResizeFcn',hObject,eventdata,guidata(hObject))

 
??? Error using ==> figure
Error while evaluating figure ResizeFcn
 


finde nicht was es sien kann? kann mir da auch jemand helfen? Programm läuft aber noch....
_________________

Gruß Jan
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: 26.09.2011, 10:55     Titel:
  Antworten mit Zitat      
Hallo phantomas_81,

Das GUI hatte wohl mal eine ResizeFcn, also eine Funktion, die beim Ändern der Größe die Positionen der einzelenn Elemente anpassen kann.
Es ist nicht klar, wieso diese Funktion nun verschwunden ist.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 12.09.11
Wohnort: Bielefeld
Version: 2011a
     Beitrag Verfasst am: 26.09.2011, 12:46     Titel:
  Antworten mit Zitat      
zurück zu meinem eigentlichen Problem.
stehe auf dem Schlauch wie ich mir die anfnags und endwerte iner Gerade bestimme.
Aus meiner Kontur kann ich mir die Bereiche wo eine Gerade liegen soll bestimmen. diese Positionen lasse ich mir in eine Variable speichern
Code:

geradenpos =

  Columns 1 through 16

     1     2     3     4     5     6     7     8     9    10    11    12    13    14    15    16

  Columns 17 through 32

    17    18    19    20    21    22    23    24    25    26    27    28    29    30    31    32

  Columns 33 through 48

    33    34    35    36    37    38    39    40    41    42    43    44    45    46    47    48

  Columns 49 through 64

    49    50    51    52    53    54    55    56    57    58    59    60    61    62    63    64

  Columns 65 through 80

    65    66    67    68    69    70    71    72    73    74    75    76    77    78    79    80

  Columns 81 through 96

    81    82    83    84    85    86    87    88    89     0     0     0     0     0    95    96

  Columns 97 through 112

    97    98    99   100   101   102   103   104   105   106   107   108   109   110   111   112

  Columns 113 through 128

   113   114   115   116   117   118   119   120   121   122   123   124   125   126   127   128

  Columns 129 through 144

   129   130   131   132   133   134   135   136   137   138   139   140   141   142   143   144

  Columns 145 through 160

   145   146   147   148   149   150   151   152   153   154   155   156   157   158   159   160

  Columns 161 through 176

   161   162   163   164   165   166   167   168   169   170   171   172   173   174   175   176

  Columns 177 through 192

   177   178   179   180   181   182   183   184   185   186   187   188   189   190   191   192

  Columns 193 through 208

   193   194   195   196   197   198   199   200   201   202   203   204   205   206   207   208

  Columns 209 through 224

   209   210   211   212   213   214   215   216   217   218   219   220   221   222   223   224

  Columns 225 through 240

   225   226   227   228   229   230   231   232   233   234   235   236   237   238   239   240

  Columns 241 through 256

   241   242   243   244   245   246   247   248   249   250   251   252   253   254   255   256

  Columns 257 through 272

   257   258   259   260   261   262   263   264   265   266   267   268   269   270   271     0

  Columns 273 through 288

     0     0     0     0   277   278   279   280   281   282   283   284   285   286   287   288

  Columns 289 through 304

   289   290   291   292   293   294   295   296   297   298   299   300   301   302   303   304

  Columns 305 through 320

   305   306   307   308   309   310   311   312   313   314   315   316   317   318   319   320

  Columns 321 through 336

   321   322   323   324   325   326   327   328   329   330   331   332   333   334   335   336

  Columns 337 through 352

   337   338   339   340   341   342   343   344   345   346   347   348   349   350   351   352

  Columns 353 through 368

   353   354   355   356   357   358   359   360   361   362   363   364   365   366   367   368

  Columns 369 through 384

   369   370   371   372   373   374   375   376   377   378   379   380   381   382   383   384

  Columns 385 through 400

   385   386   387   388   389   390   391   392   393   394   395   396   397   398   399   400

  Columns 401 through 416

   401   402   403   404   405   406   407   408   409   410   411   412   413   414   415   416

  Columns 417 through 432

   417   418   419   420   421   422   423   424   425   426   427   428   429   430   431   432

  Columns 433 through 448

   433   434   435   436   437   438   439   440   441   442   443   444   445   446   447   448

  Columns 449 through 464

   449   450   451   452   453     0     0     0     0     0     0   460   461   462   463   464

  Columns 465 through 480

   465   466   467   468   469   470   471   472   473   474   475   476   477   478   479   480

  Columns 481 through 496

   481   482   483   484   485   486   487   488   489   490   491   492   493   494   495   496

  Columns 497 through 512

   497   498   499   500   501   502   503   504   505   506   507   508   509   510   511   512

  Columns 513 through 528

   513   514   515   516   517   518   519   520   521   522   523   524   525   526   527   528

  Columns 529 through 544

   529   530   531   532   533   534   535   536   537   538   539   540   541   542   543   544

  Columns 545 through 560

   545   546   547   548   549   550   551   552   553   554   555   556   557   558   559   560

  Columns 561 through 576

   561   562   563   564   565   566   567   568   569   570   571   572   573   574   575   576

  Columns 577 through 592

   577   578   579   580   581   582   583   584   585   586   587   588   589   590   591   592

  Columns 593 through 608

   593   594   595   596   597   598   599   600   601   602   603   604   605   606   607   608

  Columns 609 through 624

   609   610   611   612   613   614   615   616   617   618   619   620   621   622   623   624

  Columns 625 through 640

   625   626   627   628   629   630   631   632   633   634     0     0     0     0     0     0

  Columns 641 through 656

   641   642   643   644   645   646   647   648   649   650   651   652   653   654   655   656

  Columns 657 through 672

   657   658   659   660   661   662   663   664   665   666   667   668   669   670   671   672

  Columns 673 through 688

   673   674   675   676   677   678   679   680   681   682   683   684   685   686   687   688

  Columns 689 through 704

   689   690   691   692   693   694   695   696   697   698   699   700   701   702   703   704

  Columns 705 through 720

   705   706   707   708   709   710   711   712   713   714   715   716   717   718   719   720

  Columns 721 through 725

   721   722   723   724   725


ind =

  Columns 1 through 16

    90    91    92    93    94   272   273   274   275   276   454   455   456   457   458   459

  Columns 17 through 22

   635   636   637   638   639   640


in
Code:
stehen die positionen wo keine keine Gerade berechnet werden soll. Dazwischen möchte ich die geraden zeichnen lassen. Meine Messdaten sind wiederum in X und Y gespeichert.
Hast du eie Idee?
_________________

Gruß Jan
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: 26.09.2011, 13:32     Titel:
  Antworten mit Zitat      
Hallo phantomas_81,

Du hast viele Zahlen gepostet, allerdings in einem unübersichtlichen Format, das man auch nicht per Copy&Paste in Matlab einfügen kann.
Was bedeuten diese Zahlen?

Was genau steht in "ind"? Postionen oder Indizes, einschließlich oder ausschließlich?

Vielleicht hilft Dir dies weiter:
Code:
y = rand(1,100);
ini = 30;
fin = 70;
poly = polyfit(ini:fin, y(ini:fin), 1);
y_2 = polyval(poly, [ini, fin]);

line(1:100, y);
line([ini, fin], [y_2], 'Color', 'red')

Die zeichnet eine Gerade mit minimalen Fehlerquadraten zwischen den X-Koordinaten 30 und 70.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 12.09.11
Wohnort: Bielefeld
Version: 2011a
     Beitrag Verfasst am: 26.09.2011, 14:42     Titel:
  Antworten mit Zitat      
Also in geradenpos stehen Positionen also indizes aus denen dann einen gerade gezeichnet werden soll. Allerdings dort wo Nullen stehen nicht, dies sind kurven in der Kontur.die erste gerade wäre dann also von geradepos1 bis 89. die nächste wäre dann ab 95 bis 271. usw.
Es fällt mir schwer diese anfangs und endposition automatisch zu ermitteln. Möchte aus den zwei Punkten die ich aus Pos1 und Pos2 erhalte mir die gerade errechnen odr zeichnen lassen
in Ind stehen die Positionen an denen keine Gerde gezeichnet werden soll
_________________

Gruß Jan
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: 26.09.2011, 16:21     Titel:
  Antworten mit Zitat      
Hallo phantomas_81,

Zitat:
in Ind stehen die Positionen an denen keine Gerde gezeichnet werden soll

Die Bedeutung dieses Satzes ist für Dich bestimmt ganz offensichtlich und klar. Ich habe aber keine Ahnung, was das genau heißt. Sind das "Positionen" im Raum, oder Indices bezüglich eines anderen Vektors. Wenn ind z.B. den Wert [13,17] hat, soll dann von 13 bit 17 keine Gerade gezeichnet werden, oder von 14 bis 16?
Da man durch das Lesen der ungefähren Beschreibung im Forum solche Details nicht erraten kann, wäre es am besten, Du implementierst die Lösung so gut Du kannst und stellst dann zu konkret auftretenden Problemen eine Frage zusammen mit dem relevanten Code-Abschnitt.

gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
phantomas_81
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 12.09.11
Wohnort: Bielefeld
Version: 2011a
     Beitrag Verfasst am: 27.09.2011, 12:37     Titel:
  Antworten mit Zitat      
Also erstmal vielen Dank für deine Anteilhabe!

Ich habe es geschafft!!
hier meine code
das Array geradenpos beinhaltet indizes Messpunkten die innerhalb einer Grenze auf einer Geraden liegen,Messpunkte die nicht auf einer Geraden liegen stehen jeweils mit einer NUll in geradenpos, die hieraus ermittelten Punkte werden dann immer zu einer geraden zusammengefasst, jeweils aus dem ersten und letzten Messpunkt. Die Messpunkte liegen in Xfilt und Yfilt.
Code:

%_____________________Geradenpositionen in Kontur ermitteln_______________________

    for n=1:length(winkel)-1
        if abs(winkel(n+1)-winkel(n))<6% Winkelgroeße als Kriterium für eine Gerade
            geradenpos(n)=n;
        end  %if
    end     %for


 %________________________________________________________
 %_____________________Geraden in Kontur berechnen_________________________
 
     startindex=0;
     geradenverdacht=0;

    for n=1:length(geradenpos)
        %Wenn Winkel<5 Grad (geradenpos>1), startindex setzen und geradenverdacht =true
        if geradenpos(n)~=0 && geradenverdacht==0;
            startindex=geradenpos(n);
            geradenverdacht=1;
        end     %if
       
        %Wenn geradenpos(n)==0 und geradenverdacht= true dann endindex setzen und geradenverdacht auf false
        if geradenpos(n)==0 && geradenverdacht ==1
            endindex=geradenpos(n-1);
            geradenverdacht=0;
            %Berechnung der Geraden
            p1(1,1)=Xfilt(startindex);
            p1(1,2)=Yfilt(startindex);
            p2(1,1)=Xfilt(endindex);
            p2(1,2)=Yfilt(endindex);
           
            if p1(1,1)<p2(1,1)
                    aufloesung=((p2(1,1)-p1(1,1))/(endindex-startindex));
                   xi=p1(1,1):aufloesung:(p2(1,1));
            else
                     aufloesung=((p1(1,1)-p2(1,1))/(endindex-startindex));
                    xi=p2(1,1):aufloesung:(p1(1,1));
            end %if
           
            m=(p2(1,2)-p1(1,2))/(p2(1,1)-p1(1,1));
            b=p1(1,2)-(m*p1(1,1));
            fx=m*xi+b;
            Xfilt(startindex:endindex)=xi;
            Yfilt(startindex:endindex)=fx;
           
        end     %if
       
        %Wenn geradenverdacht und geradenpos am Ende dann letzter index in
        %geradenpos  als endindex
        if n==length(geradenpos) && geradenverdacht==1
           
            if length(geradenpos)<length(Xfilt)
                endindex=length(Xfilt);
            else
                endindex=length(geradenpos);
            end %if
            geradenverdacht=0;
            %Berechnung der Geraden
            p1(1,1)=Xfilt(startindex);
            p1(1,2)=Yfilt(startindex);
            p2(1,1)=Xfilt(endindex);
            p2(1,2)=Yfilt(endindex);
           
            if p1(1,1)<p2(1,1)
                    aufloesung=((p2(1,1)-p1(1,1))/(endindex-startindex));
                   xi=p1(1,1):aufloesung:(p2(1,1));
            else
                     aufloesung=((p1(1,1)-p2(1,1))/(endindex-startindex));
                    xi=p2(1,1):aufloesung:(p1(1,1));
            end %if
           
            m=(p2(1,2)-p1(1,2))/(p2(1,1)-p1(1,1));
            b=p1(1,2)-(m*p1(1,1));
            fx=m*xi+b;
            Xfilt(startindex:endindex)=xi;
            Yfilt(startindex:endindex)=fx;
           
        end     %if
       

    end %for
    handles.zaehler=1;
    %---Variablen aktualisieren
guidata(hObject, handles);
end %if
 

_________________

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