matlab - 如何从(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 表示)。
解决方案
在您编辑之后,我更加想知道,如果您想要的结果应该是纯数字,为什么您首先需要符号变量和函数。
因此,避免符号:对于每个(单个)旋转矩阵以及组合旋转矩阵,设置一个匿名函数。然后,您可以使用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
}
如您所见,第一个正是您的示例——但是,请注意:在您的编辑中,您使用了sind
and cosd
,而您示例中的数据表明,您在这里使用了sin
and cos
!
希望有帮助!
免责声明:使用 Octave 5.1.0 进行测试,但也适用于 MATLAB Online。
推荐阅读
- haskell - 在 Haskell 中覆盖封装不佳的实例
- d3.js - d3 箭头函数和多个参数
- c - 随机数数组。C
- reactjs - 使用 React.lazy 的静态路由
- redux - 错误:您可能无法在 reducer 执行时调用 store.getState()(不是开发工具或记录器问题)
- powershell - System.IO.File 当前目录仅使用 TXT 文件
- java - 从下拉列表中选择 Selenium Java
- c# - VS 2017 C# 空引用异常
- javascript - 在 ajax 发布请求中使用刷新令牌
- python - numpy 3D数组中最高索引的返回值