一、矩阵相乘的性质
乘法结合律: (AB)C=A(BC).
乘法左分配律:(A+B)C=AC+BC
乘法右分配律:C(A+B)=CA+CB
对数乘的结合性k(AB)=(kA)B=A(kB).
转置 (AB)T=BTAT.
矩阵乘法一般不满足交换律。矩阵放到左边和右边是要进行装置。
二、理论推导
- 对于两个变换的叠加: 表示先进行变换,再进行 变换,这里 、都是自然基坐标系下。
- 如果 变换是在 坐标系基础上进行的,那么根据相似矩阵把转换成自然基坐标系下:
- 那么两个变换叠加就是:
这是一个很有意思的现象,如果每个变换都是在上个变换基础上进行的,那么只要把矩阵顺序反过来即可:
- 所有变换都在自然基下:
- 每个变换在前一个变换后的坐标系下:
三、结论
左乘是以固定(世界)坐标为参考的变换。右乘当前(本地)坐标系是以系为参考的变换。
四、验证实例
如向量P(红色矩形),移动矩阵(向x方向移动200个像素),旋转矩阵(顺时针旋转90度),P的初始位置位于世界坐标中心O处,局部坐标系o'和世界坐标系o重合。
向量右乘:
可以看出,红框移动到o'处,并以o'为中心旋转了90度,o'为局部坐标系
向量左乘:
可以看出,红框移动到右边,并以o为中心旋转了90度,此时o‘在下方’
可以看出,左乘和右乘的结果不一样文章来源:https://www.toymoban.com/news/detail-735652.html
以上结论以通过测试,附上qt的测试代码:文章来源地址https://www.toymoban.com/news/detail-735652.html
Widget::~Widget()
{
delete ui;
}
void Widget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.setWindow(-400,-300,800,600);
QPointF p1(-20,-100), p2 (20,100);
painter.drawRect(QRectF(p1, p2));
Eigen::Matrix3d M1;
M1 << 1,0,200,
0,1,0,
0,0,1;
Eigen::Matrix3d M2;
double r = 90*3.1415926/180;
M2 << cos(r), -sin(r), 0,
sin(r), cos(r), 0,
0,0,1;
Eigen::Vector3d p3 {p1.x(), p1.y(),1};
Eigen::Vector3d p4 {p2.x(), p2.y(),1};
#if 1
//右乘
Eigen::Vector3d p5 = M1*M2*p3;
Eigen::Vector3d p6 = M1*M2*p4;
#else
//左乘
Eigen::Vector3d p5 = M2*M1*p3;
Eigen::Vector3d p6 = M2*M1*p4;
#endif
QPointF p7(p5.x(), p5.y()), p8 (p6.x(), p6.y());
painter.setPen(Qt::red);
painter.drawRect(QRectF(p7, p8).normalized());
}
到了这里,关于坐标变换中,矩阵左乘和右乘的区别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!