Forum: PC-Programmierung Matlab: Winkelberechnung vektorisiert umsetzen


von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Hallo,

hat jemand eine Idee wie man folgendes vektorisiert schreiben könnte, 
also ohne Schleifen?
1
a = [1 2; 4 3; 9 3; ...]
2
b = [4 2; 2 1; 8 3; ...]
3
4
for a_ix = 1:size(a,1)
5
  for b_ix = 1:size(b,1)
6
    phi(a_ix,b_ix) = winkel_zwischen(n, a(a_ix,:) - b(b_ix,:));
7
  end
8
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

von Daniel (x2) (Gast)


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

von Andreas S. (andreas) (Admin) Benutzerseite


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:
1
a_rep = repmat(a, size(b,1), 1);
2
b_rep = b(repmat(1:size(b,1), size(a,1), 1), :);
3
phi = reshape(angles(n', (b_rep - a_rep)'), [size(a, 1) size(b, 1)]);
4
5
function phi = angles(a,b)
6
  phi = acos( (a' * b) ./ (sqrt(sum(a.^2, 1))' * sqrt(sum(b.^2, 1))) );

von Detlef _. (detlef_a)


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

von Daniel (x2) (Gast)


Lesenswert?

Hehe, na dann ist ja alles klar. :-)

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Danke, meshgrid dafür zu verwenden ist eine gute Idee.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.