矩阵相乘,为什么会报错,错在哪了,怎么改

旋转矩阵 aa = np.sin(pitch) * np.sin(roll) * np.cos(yaw) bb = np.cos(pitch) * np.sin(roll) * np.cos(yaw) cc = np.sin(pitch) * np.sin(roll) * np.sin(yaw) dd = np.cos(pitch) * np.sin(roll) * np.sin(yaw) o = np.array([[np.cos(yaw) * np.cos(roll), aa - np.cos(pitch) * np.sin(yaw), bb + np.sin(pitch) * np.sin(yaw)], [np.cos(roll) * np.sin(yaw), cc + np.cos(pitch) * np.cos(yaw), dd - np.sin(pitch) * np.cos(yaw)], [-np.sin(roll), np.sin(pitch) * np.cos(roll), np.cos(pitch) * np.cos(roll)] ]) g = np.array([[gyro_x], [gyro_y], [gyro_z]]) m = np.array([[m_x], [m_y], [m_z]]) # 坐标系转换 g = np.dot(o, g) m = np.dot(o, m)

img


ValueError: shapes (3,3,949) and (3,1,949) not aligned: 949 (dim 2) != 1 (dim 1)

引用chatgpt部分指引作答:
错误提示指出,矩阵维度不对齐。原因是向量g和m的形状是(3,1,949),而矩阵o的形状是(3,3,949)。由于矩阵相乘要求左矩阵的列数等于右矩阵的行数,因此在这种情况下不能直接执行矩阵乘法。

要将g和m转换为形状为(3,949)的矩阵,可以使用numpy的squeeze函数消除多余的维度。

g = np.squeeze(g)
m = np.squeeze(m)

然后再执行矩阵乘法,即可得到形状为(3,949)的结果。

g = np.dot(o, g)
m = np.dot(o, m)

这段代码中可能会出错的地方是在矩阵相乘时,维度不匹配。在这里,你需要确保旋转矩阵 o 和陀螺仪数据 g 和磁力计数据 m 的维度匹配。

在这段代码中,你定义了旋转矩阵 o 的形状为 3x3,而陀螺仪数据 g 和磁力计数据 m 的形状为 1x3。因此,你需要将陀螺仪数据 g 和磁力计数据 m 转换为 3x1 的形状,以便与旋转矩阵 o 相乘。你可以使用 .reshape() 方法来实现这一点。

正确的代码应该是:

g = np.array([gyro_x, gyro_y, gyro_z]).reshape(3, 1)
m = np.array([m_x, m_y, m_z]).reshape(3, 1)
o = np.array([[np.cos(yaw) * np.cos(roll), aa - np.cos(pitch) * np.sin(yaw), bb + np.sin(pitch) * np.sin(yaw)], [np.cos(roll) * np.sin(yaw), cc + np.cos(pitch) * np.cos(yaw), dd - np.sin(pitch) * np.cos(yaw)], [-np.sin(roll), np.sin(pitch) * np.cos(roll), np.cos(pitch) * np.cos(roll)]])
g = np.dot(o, g)
m = np.dot(o, m)

在这里,我们使用 .reshape() 方法将陀螺仪数据 g 和磁力计数据 m 的形状从 1x3 转换为 3x1。然后,我们使用 np.dot() 方法将旋转矩阵 o 与陀螺仪数据 g 和磁力计数据 m 相乘。