MATLAB: Vectorization of Operation inside Matrix

for loopmatrixoptimizationvectorization

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!

Best Answer

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)]
Related Question