Vectorization of Operation inside Matrix

DH is a 7*5 double.
The values in each row of DH are used for calculation in each loop.
To speed up, I've used pre-location. But can it be faster with vectorization?
DH = psm_m.DH;
n = size(DH,1);
T_i_All = zeros(4,4,n);
for i = 1:n
T_i_All (:,:,i)= [cos(DH(i,5)) -sin(DH(i,5)) 0 DH(i,3);
(sin(DH(i,5)))*(cos(DH(i,2))) (cos(DH(i,5)))*(cos(DH(i,2))) -sin(DH(i,2)) -(sin(DH(i,2)))*DH(i,4);
(sin(DH(i,5)))*(sin(DH(i,2))) (cos(DH(i,5)))*(sin(DH(i,2))) cos(DH(i,2)) (cos(DH(i,2)))*DH(i,4);
0 0 0 1];
end
I followed the MATLAB example
t = 0:.01:10; %example
y = sin(t); %example
But it doesn't work.
i=1:n;
T_i_All (:,:,i)= [cos(DH(i,5)) -sin(DH(i,5)) 0 DH(i,3);
(sin(DH(i,5)))*(cos(DH(i,2))) (cos(DH(i,5)))*(cos(DH(i,2))) -sin(DH(i,2)) -(sin(DH(i,2)))*DH(i,4);
(sin(DH(i,5)))*(sin(DH(i,2))) (cos(DH(i,5)))*(sin(DH(i,2))) cos(DH(i,2)) (cos(DH(i,2)))*DH(i,4);
0 0 0 1];
(Error using horzcat
Dimensions of matrices being concatenated are not consistent.)
Any help? Thanks!

 Respuesta aceptada

Guillaume
Guillaume el 18 de Dic. de 2018
First, permute DH so that the rows are in the 3rd dimension as in your output. Then you can vectorise your calculation:
DH = permute(psm_m.DH, [3 2 1]);
n = size(DH, 3);
T_i_All = [cos(DH(1, 5, :)), -sin(DH(1, 5, :)), repmat(0, 1, 1, n), DH(1, 3, :);
sin(DH(1, 5, :)).*cos(DH(1, 2, :)), cos(DH(1, 5, :)).*cos(DH(1, 2, :)), -sin(DH(1, 2, :)), -sin(DH(1, 2, :)).*DH(1, 4, :);
sin(DH(1, 5, :)).*sin(DH(1, 2, :)), cos(DH(1, 5, :)).*sin(DH(1, 2, :)), cos(DH(1, 2, :)), cos(DH(1, 2, :)).*DH(1, 4, :);
repmat([0 0 0 1], 1, 1, n)]

5 comentarios

madhan ravi
madhan ravi el 18 de Dic. de 2018
+1 amazing!
Laurel Castillo
Laurel Castillo el 18 de Dic. de 2018
agree, thanks so much!! First time to see permute and repmat function!
now T_i_All is 4*4*7, can we also obtain [T_i_All(:,:,1); T_i_All(:,:,:1)*T_i_All(:,:,:2); T_i_All(:,:,:1)*T_i_All(:,:,:2)*T_i_All(:,:,:3) ......]?
Guillaume
Guillaume el 18 de Dic. de 2018
Is your multiply a matrix multiplication or an element-wise multiplication?
Laurel Castillo
Laurel Castillo el 18 de Dic. de 2018
matrix multiplication!
Guillaume
Guillaume el 18 de Dic. de 2018
Editada: Guillaume el 18 de Dic. de 2018
I don't see a way to vectorise that. You'll have to use a loop:
composition = T_i_all;
for page = 2:size(composition, 3)
composition(:, :, page) = composition(:, :, page) * composition(:, :, page-1);
end

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre Matrices and Arrays en Centro de ayuda y File Exchange.

Preguntada:

el 18 de Dic. de 2018

Editada:

el 18 de Dic. de 2018

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by