あなたがしようとしていることはわかりませんが、クォータニオンの集合に対して四元数の乗算を実行しようとしているようです。
は
Wikipediaの四元数乗算の定義(すなわち、予め消化分析式を)読んだ一つは、二つの個々の四元数乗算するこの定義を書くことができる:この文脈で
function Out = multiply_two_quaternions (a, b)
assert (size (a, 1) == 4, 'Quaternions should be expressed as vectors of 4 elements (i.e. rows)');
assert (size (b, 1) == 4, 'Quaternions should be expressed as vectors of 4 elements (i.e. rows)');
% definition according to wikipedia#
Out = ...
[a(1) * b(1) - a(2) * b(2) - a(3) * b(3) - a(4) * b(4); ...
a(1) * b(2) + a(2) * b(1) + a(3) * b(4) - a(4) * b(3); ...
a(1) * b(3) - a(2) * b(4) + a(3) * b(1) + a(4) * b(2); ...
a(1) * b(4) + a(2) * b(3) - a(3) * b(2) + a(4) * b(1) ];
end
を、四元4-として表され要素ベクトル(すなわち垂直配列)。たとえば、1 + 2i + 3j + 4kは[1;2;3;4]
となります。
今、10個の四元数の「コレクション」があるとします。これは、4行10列の行列として簡単に表現できます。各列は四元数です。
質問が返ってくるので、10回ループするのではなく、multiply_two_quaternions
関数を使用して、これらの10クォータニオンを1回のベクトル化操作でどのように乗算できますか?
あなたがarrayfun
ようなもので、その特定の機能を使用することができますが、最も簡単な方法は、例えば、列にわたって要素ごとの乗算を行いmultiply_two_arrays_of_quaternions
関数としてあなたの関数を再定義することです
function Out = multiply_two_arrays_of_quaternions (a, b)
assert (size (a, 1) == 4, 'An array of N Quaternions should be expressed as a matrix of 4 rows and N columns');
assert (size (b, 1) == 4, 'An array of N Quaternions should be expressed as a matrix of 4 rows and N columns');
Out = ...
[a(1,:) .* b(1,:) - a(2,:) .* b(2,:) - a(3,:) .* b(3,:) - a(4,:) .* b(4,:); ...
a(1,:) .* b(2,:) + a(2,:) .* b(1,:) + a(3,:) .* b(4,:) - a(4,:) .* b(3,:); ...
a(1,:) .* b(3,:) - a(2,:) .* b(4,:) + a(3,:) .* b(1,:) + a(4,:) .* b(2,:); ...
a(1,:) .* b(4,:) + a(2,:) .* b(3,:) - a(3,:) .* b(2,:) + a(4,:) .* b(1,:) ];
end
使用例:
>> A = randi(10, [4, 10]), B = randi(10, [4, 10]), a = A(:,1), b = B(:,1)
A =
3 4 10 3 7 3 1 10 3 6
2 10 10 5 8 4 3 8 5 3
3 5 5 6 3 5 9 5 10 5
5 2 2 3 2 6 1 6 6 7
B =
7 1 1 2 5 9 1 10 9 9
4 9 3 8 8 4 8 7 6 1
4 10 4 2 8 7 6 7 2 5
10 8 7 7 10 2 5 9 3 2
a =
3
2
3
5
b =
7
4
4
10
>> multiply_two_quaternions(a,b)
ans =
-49
36
33
61
>> multiply_two_arrays_of_quaternions(A,B)
ans =
-49 -152 -54 -67 -73 -36 -82 -45 -41 12
36 66 67 70 110 16 50 153 81 8
33 -17 -19 7 7 82 8 90 117 76
61 89 97 -11 120 68 -48 171 13 85
これはあなたが考えていたものでない場合、私は謝罪が、あなたのコードは非常に紛らわしいです。あなたは行列の乗算について話しますが、AとBをセルとしてアクセスしようとします...そして、あなたは私の定義、またはAとBの形式を表示していないので、quatmultiplyが何をするのか分かりません(つまり、クォータニオン)。セルを使用している場合は、ループを操作している間にセルを表現するのは非常に非効率的です。
また、一般的なコメントとして、意味のある変数や関数名などで、適切にインデントされたきれいでよく書かれたコードを書き込もうとします。p これは大きな違いになります。
私はこの関数を使うことを知っていますが、nがクォータニオンに射影していたので、 –
より具体的にしてください。 –
私は同じ関数を使ってクォータニオンの行列を乗算します。*はquatmultiplyと+ quaterionsのために存在します –