Matlab: Winkelberechnung vektorisiert umsetzen

Admin Persönliche Seite #673073
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
Gast #673110
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. ;)
Admin Persönliche Seite #673176
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))) );

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren