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

for-Schleife anwenden

 

Nummi
Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 01.12.21
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.12.2021, 09:11     Titel: for-Schleife anwenden
  Antworten mit Zitat      
Hallo zusammen

Folgendes Problem (Matlab-Neuling):

Ich habe aus 2D-LiDAR-Daten eine 3D-Punktwolke erzeugt. Die Daten werden grundsätzlich stets um 5° gedreht, bis die ganze Umdrehung abgedeckt ist (siehe Abb.)
Anschliessend habe ich über jeweils 3 Punkte Ausgleichsgeraden gelegt. Diese geben mir die Steigung an. Da der gegebene Grenzwert bei 30° liegt, habe ich die einzelnen Geraden jeweils rot und grün geplottet.
Dies habe ich bisher für den Winkel 5° erledigt.
Nun möchte ich dies durch eine Schleife auch für die restlichen Winkel (5° bis 360°) rechnen.
Schlussendlich soll ein 3D-Plot mit den jeweiligen Ausgleichsgeraden entstehen.

Ich hoffe, man weiss was ich in etwa meine.

Ich danke euch für eure Ratschläge Smile
Bilder und Daten sind im Anhang

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)


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);

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

    Steigung{j} = 360/(2*pi) * atan(tneu{j}(1))
if Steigung{j} <= 30
    plot(xneu{j},zneu{j},"r")
else
    plot(xneu{j},zneu{j},"g")
hold on
end
end

hold off


 


Messung_4_effektiv.txt
 Beschreibung:

Download
 Dateiname:  Messung_4_effektiv.txt
 Dateigröße:  268.83 KB
 Heruntergeladen:  218 mal
Screenshot 2021-12-21 090850.png
 Beschreibung:

Download
 Dateiname:  Screenshot 2021-12-21 090850.png
 Dateigröße:  19.58 KB
 Heruntergeladen:  212 mal
Screenshot 2021-12-21 090817.png
 Beschreibung:

Download
 Dateiname:  Screenshot 2021-12-21 090817.png
 Dateigröße:  77.03 KB
 Heruntergeladen:  225 mal
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 21.12.2021, 10:47     Titel: Re: for-Schleife anwenden
  Antworten mit Zitat      
Hallo,

Zitat:
Nun möchte ich dies durch eine Schleife auch für die restlichen Winkel (5° bis 360°) rechnen.

Was hast du hier denn versucht? Im wesentlichen brauchst du eine weitere Schleife wie die momentane um alles herum, was wiederholt gemacht werden soll.
Du solltest dir auch überlegen, welche Daten du speichern möchtest und wie. Beispielsweise als 2D Cell Array?

Zitat:
Schlussendlich soll ein 3D-Plot mit den jeweiligen Ausgleichsgeraden entstehen.

Dann müsstest du dir überlegen, was auf welche Achse soll. Eventuell kannst du für x und y die ursprünglichen x- und y-Werte verwenden, aber dann musst du sie entsprechend raussuchen wie derzeit für r.

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: 21.12.2021, 12:28     Titel:
  Antworten mit Zitat      
Hallo Harald

Ich habe versucht eine weitere for-Schleife vor der bereits bestehenden zu schreiben, bin aber überhaupt nicht weiter gekommen. Mir ist nicht ganz klar, wie ich diese aufbauen soll, damit stets mit den Daten des nächste Winkels berechnet wird.

Gespeichert sollen die Daten lediglich soweit, dass ich danach sämtliche Ausgleichgeraden in einer 3D-Grafik plotten kann.

Gruss

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

Forum-Meister


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

Zitat:
Ich habe versucht eine weitere for-Schleife vor der bereits bestehenden zu schreiben, bin aber überhaupt nicht weiter gekommen.

Bitte immer posten, was du versucht hast.

Zitat:
Mir ist nicht ganz klar, wie ich diese aufbauen soll, damit stets mit den Daten des nächste Winkels berechnet wird.

Ein Array winkel mit den zu durchlaufenden Winkeln erstellen und dann immer mit winkel(idx) statt 5 arbeiten.

Und wie gesagt:
Dann müsstest du dir überlegen, was auf welche Achse soll. Eventuell kannst du für x und y die ursprünglichen x- und y-Werte verwenden, aber dann musst du sie entsprechend raussuchen wie derzeit für r.

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: 21.12.2021, 21:22     Titel:
  Antworten mit Zitat      
Ich habe folgende Schlaufe versucht:
Code:


anzahlWinkel = size(uWinkel,1)

for b = 1:anzahlWinkel
    e = uWinkel(b)
   
   rSelect{e} = r(winkel == e)
   zSelect{e} = z(winekl == e)
   rSelect_def{e} = rSelect{e}(rSelect{e} <= 500);
   zSelect_def{e} = zSelect{e}(rSelect{e} <= 500);
end

 


Dabei kommt der Fehlefcode:
"Array indices mus be positive intergers or logical values."

Die Winkel beginnen bei -175 und enden bei 180.

Gruss
Nummi
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 21.12.2021, 23:09     Titel:
  Antworten mit Zitat      
Hallo,

das sieht abgesehen von Schreibfehlern bei winkel erst mal sinnvoll aus. Die Schleife für das Fitten der Polynome muss aber noch mit in diese Schleife.
In welcher Zeile wird denn die Fehlermeldung geworfen?

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: 22.12.2021, 07:25     Titel:
  Antworten mit Zitat      
Der Schreibfehler muss so sein, da ich bereits zuvor die Winkel mit der Variable uWinkel festgelegt habe (siehe ganzer Code oben, Zeile 14).

So sieht der Abschnitt nun aus:
Code:

anzahlWerte = size(rSelect5_1,1)
anzahlWinkel = size(uWinkel,1)


rSelect = cell(1, anzahlWinkel);
zSelect = cell(1, anzahlWinkel);
rSelect_def = cell(1,anzahlWinkel);
zSelect_def = cell(1,anzahlWinkel);

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 b = 1:anzahlWinkel
    e = uWinkel(b)
    j = 1:numel(alle_i)
    i = alle_i(j);
    k = (i:i+2);

   
   rSelect{e} = r(winkel == e)
   zSelect{e} = z(winekl == e)
   rSelect_def{e} = rSelect{e}(rSelect{e} <= 500);
   zSelect_def{e} = zSelect{e}(rSelect{e} <= 500);

   rZone{e} = rSelect{e}(k);
   zZone{e} = zSelect{e}(k);
   tneu{j} = polyfit(rZone{e}, zZone{e},1)
   xneu{j} = rZone{e};
   zneu{j} = polyval(tneu{j},xneu{j});

   Steigung{j} = 360/(2*pi) * atan(tneu{j}(1))

if Steigung{j} <= 30
    plot(xneu{j},zneu{j},"r")
else
    plot(xneu{j},zneu{j},"g")
hold on
end
end

hold off


 


Die Fehlermeldung tritt bereits bei Zeile 46 auf (rSelect {e} = r(Winkel == e))

Und ist es richtig, dass ich rSelect, zSelect etc als Cell definiere oder sollte ich das lieber lassen?

Gruss

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

Forum-Meister


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

du brauchst wirklich zwei geschachtelte Schleifen. Mit dem Schreibfehler meinte ich "winekl".

Zitat:
Und ist es richtig, dass ich rSelect, zSelect etc als Cell definiere oder sollte ich das lieber lassen?

Das ist nur nötig, wenn die Ergebnisse am Ende verfügbar sein sollen.

Hier kompletter 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);

for b = 1:length(uWinkel)
    e = uWinkel(b);
    r = sqrt(M(:,1).^2 + M(:,2).^2);

    rSelect = r(winkel == e);
    zSelect = z(winkel == e);
    rSelect_def = rSelect(rSelect <= 500);
    zSelect_def = zSelect(rSelect <= 500);

    anzahlWerte = size(rSelect_def,1);


    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 = rSelect_def(k);
        zZone = zSelect_def(k);
        tneu{j} = polyfit(rZone, zZone,1);
        xneu{j} = rZone;
        zneu{j} = polyval(tneu{j},xneu{j});

        Steigung{j} = 360/(2*pi) * atan(tneu{j}(1));
        if Steigung{j} <= 30
            plot3(xneu{j}*cosd(e),xneu{j}*sind(e),zneu{j},"r")
        else
            plot3(xneu{j}*cosd(e),xneu{j}*sind(e),zneu{j},"g")
            hold on
        end
    end
end

hold off


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
 
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 - 2024 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.