Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Bücher:

MATLAB und Simulink: Grundlegende Einführung f. Studenten

Fachkräfte:
weitere Angebote

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Ausgleichsgerade nur in bestimmten Bereich

 

Nummi
Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 01.12.21
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.12.2021, 09:39     Titel: Ausgleichsgerade nur in bestimmten Bereich
  Antworten mit Zitat      
Hallo zusammen
Folgendes Problem:
Ich möchte eine Ausgleichsgerade über meine Funktion legen, welche aber nur einen gewissen Bereich berücksichtigt (z.B. immer nur 5 Punkte, dann die nächsten 5 usw.)
Die Daten sind im Anhang. Diese ergeben zunächst eine 3D-Punktwolke, aus welcher ich die gewünschte 2D-Funktion ausgelesen habe (sozusagen ein Schnitt durch die Punktwolke)

Ich danke euch für eure Hilfe Smile

Code:

M = readmatrix("Messung_4_effektiv.txt");
x = (M(:,1));
y = (M(:,2));
z = (M(:,3));
ptCloud = pointCloud(M);
ptCloud
pcshow(ptCloud)
zlim([-2300 -1800])

winkel = round(atan2d(y, x), 2);
uWinkel = unique(winkel);

r = sqrt(M(:,1).^2 + M(:,2).^2);

f = plot(r(winkel == -175), M(winkel == -175,3),".")
hold on
p = plot(-r(winkel == 5), M(winkel == 5,3), ".")
hold off

xlabel('x [mm]')
ylabel('y [mm]')
title('Messdaten LiDAR 5°')
grid on
ylim([-2300 -1800])
xlim([-500 500])
 


Screenshot 2021-12-11 083734.png
 Beschreibung:

Download
 Dateiname:  Screenshot 2021-12-11 083734.png
 Dateigröße:  28.65 KB
 Heruntergeladen:  56 mal
Messung_4_effektiv.txt
 Beschreibung:

Download
 Dateiname:  Messung_4_effektiv.txt
 Dateigröße:  268.83 KB
 Heruntergeladen:  67 mal
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.044
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 11.12.2021, 12:22     Titel:
  Antworten mit Zitat      
Hallo,

was hast du versucht, welche Probleme sind dabei aufgetreten?
Mit polyfit sollte das recht schnell gehen. Du brauchst nur jeweils die Punkte zu extrahieren, mit denen du arbeiten willst. Was soll mit den letzten Punkten gemacht werden, falls die Anzahl der Punkte nicht durch z.B. 5 teilbar ist?

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Nummi
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 01.12.21
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.12.2021, 17:04     Titel:
  Antworten mit Zitat      
Hallo Harald
Ich habe wenig Erfahrung mit Matlab, deshalb habe ich die Funktion Polyfit an einem einfacheren Beispiel ausprobiert. Da funktioniert diese auch, jedoch eben über den gesamten x-Bereich. Wie kann ich diesen Bereich eingrenzen? Beispielsweise nur zwischen x=-500 und x=500.
Was bei den letzten Punkten geschehen soll, falls zu noch zu wenig vorhanden sind, spielt keine grosse Rolle. Es kann auch eine Ausgleichsgerade über die noch verfügbaren Punkte legen.
Vielleicht sollte ich noch anmerken, dass das schlussendliche Ziel ist, die einzelnen Steigungen zu bestimmen. Dies sollte jedoch die Funktion Polyfit ausgeben, wenn ich das richtig verstanden habe?

Gruss
IG

Code:

%Das vereinfachte Beispiel
x = 1:5;
y = 2*x+3+randn(size(x))*0.2;
yp = polyfit(x,y,1);
y1 = polyval(yp,x)
plot(x,y,'*',x,polyval(yp,x))
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.044
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 11.12.2021, 19:00     Titel:
  Antworten mit Zitat      
Hallo,

um das Leben zu erleichtern, würde ich zunächst die Daten zusammenfassen:
Code:
rSelect = [r(winkel == -175); -r(winkel == 5)];

und entsprechend für die z-Werte.

Zitat:
Wie kann ich diesen Bereich eingrenzen? Beispielsweise nur zwischen x=-500 und x=500.

x ist hier r, oder? Mit logischer Indizierung, wie bei der Filterung nach Winkel auch:
Code:
rSelect2 = rSelect(rSelect >= -500 & rSelect <= 500);

und z-Werte entsprechend filtern. Entscheidend ist für mich aber, dass das jetzt eine andere Frage ist als die ursprüngliche. Es hilft ungemein, sich im voraus zu überlegen, was man machen möchte.

Der Vollständigkeit halber: 5 Werte auswählen mit
Code:
rSelect2 = rSelect(k:k+5);

wobei k der Schleifenindex ist.

Zitat:
Vielleicht sollte ich noch anmerken, dass das schlussendliche Ziel ist, die einzelnen Steigungen zu bestimmen. Dies sollte jedoch die Funktion Polyfit ausgeben, wenn ich das richtig verstanden habe?

Ja. Wenn man die Koeffizienten einer Ausgleichsgeraden hat, hat man insbesondere auch ihre Steigung.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Nummi
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 01.12.21
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.12.2021, 09:57     Titel:
  Antworten mit Zitat      
Das hat mir schon gut weitergeholfen, danke Dir!

Dies führt mich zu meiner nächsten Frage:

Ich habe das ganze nun in einen Loop verpackt, damit es die gesamten Daten abarbeitet. Nun möchte ich aber, dass die Variablen jeweils den jeweiligen Schleifenindex im Namen tragen.

Code:

for i = 1:2:anzahlWerte-2
            k = (i:i+2);
            rZone = rSelect5_1(k);
            zZone = zSelect5_1(k);
            t1 = polyfit(rZone, zZone,1)
            x1 = rZone
            z1 = polyval(t1,x1)
           
end

 


Dieser Code gibt mir jeweils t1, x1 und z1 an, überschreibt jedoch immer den vorherigen. Wie erreiche ich es, dass jeweils x1, x2, x3 usw. ausgegeben und gespeichert wird? Ich sollte anschliessend mit den jeweiligen Werten weiterrechnen.

Ich hoffe man versteht was ich meine

Gruss

IG
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.044
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 15.12.2021, 11:35     Titel:
  Antworten mit Zitat      
Hallo,

durchnumerierte Variablen sind schwer weiter zu verarbeiten. Meine Empfehlung wäre stattdessen Cell Arrays zu verwenden.
Code:
t{i} = ...


Damit keine Lücken im Array entstehen, würde ich versuchen, die for-Schleife in der Form for j = 1:N und dann i daraus berechnen.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Nummi
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 01.12.21
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.12.2021, 12:59     Titel:
  Antworten mit Zitat      
Meinst du in etwa so?

Code:

for j = 1:anzahlWerte
    for i = j:2:anzahlWerte-2
            k = (i:i+2);

            rZone = rSelect5_1(k);
            zZone = zSelect5_1(k);
            t{j} = polyfit(rZone, zZone,1);
            x{j} = rZone
            z{j} = polyval(t{j},x{j});
           
           
    end
end
 


Dabei entsteht folgende Fehlermeldung für t{j} = polyfit(rZone, zZone,1);

"Unable to perform assignment because brace indexing is not supported for variables of this type"
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

wahrscheinlich hast du von vorherigen Versuchen noch t, x und z im Speicher. Führe mal clear aus.

Das innere sollte keine for-Schleife sein, eher:
for j = 1:anzahlWerte
i = j:2:anzahlWerte-2

wobei i wohl nicht bis "anzahlWerte" gehen sollte.

Langfristig sollte man t, x und z auch als Cell Arrays vorbelegen.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Nummi
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 01.12.21
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.12.2021, 14:06     Titel:
  Antworten mit Zitat      
Der Fehler bleibt leider weiterhin bestehen. Ich habe etwas ähnliches mit der Funktion eval gelesen, denkst du dass es allenfalls mit dieser gehen würde?

Gruss
IG
Private Nachricht senden Benutzer-Profile anzeigen
 
Nummi
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 01.12.21
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.12.2021, 14:23     Titel:
  Antworten mit Zitat      
Um vielleicht zu verdeutlichen was ich genau will, hinterlege ich dir hier den vollständigen Code:

Code:

M = readmatrix("Messung_4_effektiv.txt");
x = (M(:,1));
y = (M(:,2));
z = (M(:,3));
ptCloud = pointCloud(M);
ptCloud
pcshow(ptCloud)
zlim([-2300 -1800])


winkel = round(atan2d(y, x), 2);
uWinkel = unique(winkel);


r = sqrt(M(:,1).^2 + M(:,2).^2);

rSelect5 = r(winkel == 5);
zSelect5 = z(winkel == 5);
rSelect5_1 = rSelect5(rSelect5 <= 500);
zSelect5_1 = zSelect5(rSelect5 <= 500);

anzahlWerte = size(rSelect5_1,1)

% Zone 1
i1 = (1:3);
rZone1 = rSelect5_1(i1)
zZone1 = zSelect5_1(i1)
t1 = polyfit(rZone1,zZone1,1)
x1 = rZone1
z1 = polyval(t1,x1)

% Zone 2
i2 = (3:5);
rZone2 = rSelect5_1(i2)
zZone2 = zSelect5_1(i2)

t2 = polyfit(rZone2,zZone2,1)
x2 = rZone2
z2 = polyval(t2,x2)

% Zone 3
i3 = (5:7);
rZone3 = rSelect5_1(i3)
zZone3 = zSelect5_1(i3)

t3 = polyfit(rZone3,zZone3,1)
x3 = rZone3
z3 = polyval(t3,x3)

% Zone 4
i4 = (7:9);
rZone4 = rSelect5_1(i4)
zZone4 = zSelect5_1(i4)

t4 = polyfit(rZone4,zZone4,1)
x4 = rZone4
z4 = polyval(t4,x4)

% Zone 5
i5 = (9:11);
rZone5 = rSelect5_1(i5)
zZone5 = zSelect5_1(i5)

t5 = polyfit(rZone5,zZone5,1)
x5 = rZone5
z5 = polyval(t5,x5)

% Zone 6
i6 = (11:13);
rZone6 = rSelect5_1(i6)
zZone6 = zSelect5_1(i6)

t6 = polyfit(rZone6,zZone6,1)
x6 = rZone6
z6 = polyval(t6,x6)

% Zone 7
i7 = (13:15);
rZone7 = rSelect5_1(i7)
zZone7 = zSelect5_1(i7)

t7 = polyfit(rZone7,zZone7,1)
x7 = rZone7
z7 = polyval(t7,x7)

% Zone 8
i8 = (15:17);
rZone8 = rSelect5_1(i8)
zZone8 = zSelect5_1(i8)

t8 = polyfit(rZone8,zZone8,1)
x8 = rZone8
z8 = polyval(t8,x8)

% Zone 9
i9 = (17:19);
rZone9 = rSelect5_1(i9)
zZone9 = zSelect5_1(i9)

t9 = polyfit(rZone9,zZone9,1)
x9 = rZone9
z9 = polyval(t9,x9)

% Zone 10
i10 = (19:21);
rZone10 = rSelect5_1(i10)
zZone10 = zSelect5_1(i10)

t10 = polyfit(rZone10,zZone10,1)
x10 = rZone10
z10 = polyval(t10,x10)

% Zone 11
i11 = (21:23);
rZone11 = rSelect5_1(i11)
zZone11 = zSelect5_1(i11)

t11 = polyfit(rZone11,zZone11,1)
x11 = rZone11
z11 = polyval(t11,x11)

% Zone 12
i12 = (23:25);
rZone12 = rSelect5_1(i12)
zZone12 = zSelect5_1(i12)

t12 = polyfit(rZone12,zZone12,1)
x12 = rZone12
z12 = polyval(t12,x12)



curve5 = plot(rSelect5_1, zSelect5_1, "b:+")
hold on

poly1 = plot(x1,z1,"r")
poly2 = plot(x2,z2,"r")
poly3 = plot(x3,z3,"r")
poly4 = plot(x4,z4,"r")
poly5 = plot(x5,z5,"r")
poly6 = plot(x6,z6,"r")
poly7 = plot(x7,z7,"r")
poly8 = plot(x8,z8,"r")
poly9 = plot(x9,z9,"r")
poly10 = plot(x10,z10,"r")
poly11 = plot(x11,z11,"r")
poly12 = plot(x12,z12,"r")
hold off

Steigung1 = 360/(2*pi) * atan(t1(1))
Steigung2 = 360/(2*pi) * atan(t2(1))
Steigung3 = 360/(2*pi) * atan(t3(1))
Steigung4 = 360/(2*pi) * atan(t4(1))
Steigung5 = 360/(2*pi) * atan(t5(1))
Steigung6 = 360/(2*pi) * atan(t6(1))
Steigung7 = 360/(2*pi) * atan(t7(1))
Steigung8 = 360/(2*pi) * atan(t8(1))
Steigung9 = 360/(2*pi) * atan(t9(1))
Steigung10 = 360/(2*pi) * atan(t10(1))
Steigung11 = 360/(2*pi) * atan(t11(1))
Steigung12 = 360/(2*pi) * atan(t12(1))

 


Das mit den einzelnen Zonen würde ich gerne in einen Loop schreiben, da ich es später noch für alle Messdaten machen muss.

Screenshot 2021-12-15 132128.png
 Beschreibung:

Download
 Dateiname:  Screenshot 2021-12-15 132128.png
 Dateigröße:  37.19 KB
 Heruntergeladen:  52 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.044
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 15.12.2021, 15:28     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Ich habe etwas ähnliches mit der Funktion eval gelesen, denkst du dass es allenfalls mit dieser gehen würde?

Theoretisch geht es, praktisch ist es aber nicht empfehlenswert.

clear hat nicht geholfen, weil du am Anfang deines Skripts Variablen dieser Namen erstellst. Vorschlag:

Code:
alle_i = 1:2:anzahlWerte-2;
tneu = cell(1, numel(alle_i));
xneu = cell(1, numel(alle_i));
zneu = cell(1, numel(alle_i));

for j = 1:numel(alle_i)
    i = alle_i(j);
    k = (i:i+2);

    rZone = rSelect5_1(k);
    zZone = zSelect5_1(k);
    tneu{j} = polyfit(rZone, zZone,1);
    xneu{j} = rZone;
    zneu{j} = polyval(tneu{j},xneu{j});

end


Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Nummi
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 01.12.21
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.12.2021, 16:50     Titel:
  Antworten mit Zitat      
Es funktioniert Smile
Ich danke dir Harald!
Damit kann ich gut weiterarbeiten. Nun muss ich den Code noch so erweitern, dass es dies auf sämtliche Winkel anwendet. Falls ich nicht weiterkomme, melde ich mich wieder.
Danke!

Gruss
IG
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
.


goMatlab ist ein Teil des goForen-Labels
goForen.de goMATLAB.de goLaTeX.de


 Impressum  | Nutzungsbedingungen  | Datenschutz  | Werbung/Mediadaten | Studentenversion | FAQ | goMatlab RSS Button RSS


Copyright © 2007 - 2022 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
Partner: LabVIEWforum.de

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.