避免matlab中的循环乘法

时间:2016-07-17 01:08:32

标签: matlab loops matrix product

这个函数允许我用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

3 个答案:

答案 0 :(得分:0)

A*B。 Matlab默认支持矩阵算术运算而没有循环。

答案 1 :(得分:0)

我认为对你来说,使用mex会好得多。

由于它只是简单的循环,因此使用mex文件并不困难。

答案 2 :(得分:0)

我不清楚你尝试做什么,但似乎你只是试图对四元数集合执行四元数乘法。

在维基百科上阅读了四元数乘法的定义(即简化的解析公式)之后,人们可以写出这个定义来乘以两个单独的四元数:

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列,其中每列是四元数。

所以问题变成了,如何使用我的multiply_two_quaternions函数在单个向量化操作中将这10个四元数相乘,而不是循环十次?

可能使用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作为单元格进行访问......然后我不知道quatmultiply是做什么的,因为你没有向我展示它的定义,或A和B的格式(即你如何代表你的四元数)。如果您正在使用单元格,那么表示它们将是一种非常低效的方式,因为您对它们的任何操作都会遇到循环。

另外,作为一般性评论,请尝试使用有意义的变量和函数名称等正确编写缩进,干净,记录良好的代码:p 它有很大的不同!