首页 > 解决方案 > 如何从(30x3)矩阵生成 10 个(3x3)矩阵并将其用于旋转矩阵

问题描述

我从 excel 文件中读取 b 的 10 个数据。我试图通过替换矩阵 [1 0 0; 来获得 10 (3x3) 个旋转矩阵;0 cos(a) -sin(a); 0 sin(a) cos(a)]。但是,我的代码生成 (30x3) 矩阵。我可以直接生成 10 个 3x3 矩阵还是有办法将三个连续的行连接在一起以从 (30x3) 矩阵中生成 10 个 3x3 矩阵?

syms a b
b = xlsread('C:\Desktop\Data.xlsx');
r = subs([1 0 0 0 cos(a) -sin(a) 0 sin(a) cos(a)], b)
rx = vec2mat(r,3)

进一步展开答案得到最终的旋转矩阵,上述结构重复三次如下图

syms a b c d rx ry rz rm
b = xlsread('C:\Desktop\Data.xlsx','A1:A10');
c = xlsread('C:\Desktop\Data.xlsx','B1:B10');
d = xlsread('C:\Desktop\Data.xlsx','C1:C10');

rx = reshape(vec2mat(subs([1 0 0 0 cosd(a) -sind(a) 0 sind(a) cosd(a)], b), 3).',3,3,numel(b));
ry = reshape(vec2mat(subs([cosd(a) 0 sind(a) 0 1 0 -sind(a) 0 cosd(a)], c), 3).',3,3,numel(b));
rz = reshape(vec2mat(subs([cosd(a) -sind(a) 0 sind(a) cosd(a) 0 0 0 1], d), 3).',3,3,numel(b));

rm = rx.*ry.*rz;

对于角度 (34, 0, 100) 角度,算法给出的答案是正确的,以度为单位

[-cos((4*pi)/9), 0 , 0]
[0, -cos((4*pi)/9*cos((17*pi)/90), 0]
[0, 0, cos((17*pi)/90)]

代替

rm =

    0.8623         0         0
         0   -0.7317         0
         0         0   -0.8486

我正在寻找具有十进制值的单个矩阵解决方案(不是以 pi 表示)。

标签: matlabmathmultiple-columnsrowsrotational-matrices

解决方案


在您编辑之后,我更加想知道,如果您想要的结果应该是纯数字,为什么您首先需要符号变量和函数

因此,避免符号:对于每个(单个)旋转矩阵以及组合旋转矩阵,设置一个匿名函数。然后,您可以使用arrayfun为每个参数集生成组合旋转矩阵。

这是一些代码:

% Parameters (from file, ...)
b = [34, 20, 30];
c = [0, 21, 31];
d = [100, 22, 32];

% Anonymous functions: (Single) rotation matrices
rot_x = @(alpha) [1 0 0; 0 cos(alpha) -sin(alpha); 0 sin(alpha) cos(alpha)];
rot_y = @(beta) [cos(beta) 0 sin(beta); 0 1 0; -sin(beta) 0 cos(beta)];
rot_z = @(gamma) [cos(gamma) -sin(gamma) 0; sin(gamma) cos(gamma) 0; 0 0 1];

% Anonymous function: Combined rotation matrix
rot_m = @(alpha, beta, gamma) rot_x(alpha) .* rot_y(beta) .* rot_z(gamma);

% Calculate combined rotation matrix for all parameter sets
rot_mats = arrayfun(rot_m, b, c, d, 'UniformOutput', false)

我们得到以下输出:

rot_mats =
{
  [1,1] =
     0.86232   0.00000   0.00000
    -0.00000  -0.73174  -0.00000
    -0.00000   0.00000  -0.84857

  [1,2] =
     0.54771   0.00000   0.00000
    -0.00000  -0.40807  -0.00000
    -0.00000   0.00000  -0.22352

  [1,3] =
     0.76310  -0.00000  -0.00000
     0.00000   0.12868   0.00000
     0.00000  -0.00000   0.14110
}

如您所见,第一个正是您的示例——但是,请注意:在您的编辑中,您使用了sindand cosd,而您示例中的数据表明,您在这里使用了sinand cos

希望有帮助!


免责声明:使用 Octave 5.1.0 进行测试,但也适用于 MATLAB Online。


推荐阅读