www.mikrocontroller.net

Forum: PC-Programmierung Matlab: Winkelberechnung vektorisiert umsetzen


Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

hat jemand eine Idee wie man folgendes vektorisiert schreiben könnte, 
also ohne Schleifen?
a = [1 2; 4 3; 9 3; ...]
b = [4 2; 2 1; 8 3; ...]

for a_ix = 1:size(a,1)
  for b_ix = 1:size(b,1)
    phi(a_ix,b_ix) = winkel_zwischen(n, a(a_ix,:) - b(b_ix,:));
  end
end

Auf Deutsch, berechne die Winkel zwischen n und den Verbindungsvektoren 
zwischen allen Punkten in a und b.

Ich habe eine vage Idee mit repmat() und reshape(), aber wenn ich 
versuche das umzusetzen artet es schnell in furchtbares Gefrickel aus. 
Fällt jemandem eine einfachere Lösung ein?

Danke
Andreas

Autor: Daniel (x2) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Auf Deutsch, berechne die Winkel zwischen n und den Verbindungsvektoren
>zwischen allen Punkten in a und b.

Also das verstehe ich irgendwie nicht. Wie heißen die 
Verbindungsvektoren? Sind a und b die Verbindungsvektoren? Ist 
"winkel_zwischen" eine eigenständige Funktion? Was macht diese?

Nimm es mir nicht übel aber so kann ich mich leider nicht reindenken und 
würde dir daher nahelegen, repmat() und reshape() zu benutzen. Mach zwei 
Spaltenvektoren draus und zieh die voneinander ab. Das zu reproduzieren 
kriegst du auch hin. ;)

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Daniel (x2) wrote:
>>Auf Deutsch, berechne die Winkel zwischen n und den Verbindungsvektoren
>>zwischen allen Punkten in a und b.
>
> Also das verstehe ich irgendwie nicht. Wie heißen die
> Verbindungsvektoren? Sind a und b die Verbindungsvektoren?

Nein, die Verbindungsvektoren zwischen den Punkten in a und b. Also 
a(a_ix,:) - b(b_ix,:).

> Ist "winkel_zwischen" eine eigenständige Funktion?

War nur ein Beispiel um das nicht ausschreiben zu müssen.

> Was macht diese?

Rate mal ;)

So scheint's jetzt zu funktionieren, ist doch nicht so kompliziert 
geworden wie befürchtet:
a_rep = repmat(a, size(b,1), 1);
b_rep = b(repmat(1:size(b,1), size(a,1), 1), :);
phi = reshape(angles(n', (b_rep - a_rep)'), [size(a, 1) size(b, 1)]);

function phi = angles(a,b)
  phi = acos( (a' * b) ./ (sqrt(sum(a.^2, 1))' * sqrt(sum(b.^2, 1))) );

Autor: Detlef _a (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
'meshgrid' liefert Dir alle gemischten Indizes, so verheirate ich immer 
alle Elemente eines Vektors mit allen Elementen eines anderen Vektors:

>> clear
>> b=1:5;
>> a=1:10;
>> [bi,ai]=meshgrid(1:length(b),1:length(a));
>> a(ai(:))-b(bi(:));

Cheers
Detlef

Autor: Daniel (x2) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hehe, na dann ist ja alles klar. :-)

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, meshgrid dafür zu verwenden ist eine gute Idee.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.