2016-07-17 14 views
-1

この関数を使うとMatlabで2つの行列を乗算することができます。彼らはあまりにも多くの時間を取るので、私はループを避ける必要があります。どうすればいいのか分かりません、助けてください。matlabでループを回避する

function a = matrice_multplication(A, B) 
    [r1 , c1] = size(A); 
    [r2 , c2] = size(B); 
% % prevent unappropriate matrix size 
if c1 ~= r2 
    disp ('*** le nombre des colonne de la premiere matrice doit etre egale ou nombre des ligne de la deuxieme matrice ***') 
end 
for i = 1 : r1 
    % Vary each column of matrix B 
    for j = 1 : c2 
     % Reset every new element of the final result 
%   c=cell (r1 , c2) 
     s = [0,0,0,0] ; 
      % Vary each column of matrix A and row of matrix B 
      for k = 1 : c1 
       % Display every element to take into account 
    %   disp( A{i,k}) 
    %  disp ( B{k,j}) 
    % f=) 
    s =plus(s,quatmultiply(A{i,k},B{k,j})); 
    %    
     end 
    %   % Assign the total of the appropriate element 
    %   % to the final matrix 
    c{i,j} = s; 
    %    disp (c{1,1}) 
    %   disp (c{1,2}) 
    %    disp (c{2,1}) 
    %    disp (c{2,2}) 
    a{i,j} = c{i,j}; 
    % disp (a{i,j}) 
     end 
    end 
      end 

答えて

0

ちょうどA*Bです。 Matlabはループのない行列算術演算をデフォルトでサポートしています。

+0

私はこの関数を使うことを知っていますが、nがクォータニオンに射影していたので、 –

+0

より具体的にしてください。 –

+0

私は同じ関数を使ってクォータニオンの行列を乗算します。*はquatmultiplyと+ quaterionsのために存在します –

0

は、私はあなたの場合のために、それを使用するためにはるかに良いことだと思うMEX

それは難しいことではありませんMEXファイルを使用して、単純なループですので。

0

あなたがしようとしていることはわかりませんが、クォータニオンの集合に対して四元数の乗算を実行しようとしているようです。

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 これは大きな違いになります。

+0

それは動作しますが、問題はmat2cellを行い、あなたが乗算を実行するようですが、これは私が必要とするものではありません2クォータニオンを乗算するには、関数quatmultiply(a、b)とプラス関数を使用してクォータニオンに加算します。私の関数では、私は例えばa = {[1 2 3 4]、[1 1 1 1]}、b = {[1 2 3 4]、[1 1 1 1]; [1 5 9 7]、[4 5 6 7]}私の関数だけどループテールが長すぎるので、私は必要とする代わりに代理人 –

+0

ちょうど 'plus()'関数と'+'演算子は等価です(実際に '+'は本質的にフードの下で 'plus()'を呼び出します)。実際には、 '[1] + {1}'というセルを持つ配列のように、一緒に追加できない2つのものを追加しようとすると、これを見ることができます。matlabはエラー 'Undefined function ' 'cell'.'型の入力引数に対しては、matlabがフードの下の2つの引数に対して実質的に 'plus'関数を呼び出したことを示します。だから、実際には、 '+'よりも '' plus() ''を使うと特にメリットはありません。 –

関連する問題