这个函数允许我用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 :(得分: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 它有很大的不同!