社区
数据结构与算法
帖子详情
求三维向量组仿射变换的快速算法。
pulley
2003-09-23 10:47:19
加精
对一组三维向量进行仿射变换,也就是与仿射变换矩阵相乘(4*4)。我是每个向量分别与矩阵相乘的,已经考虑到了仿射变换的特殊性,减少了一些乘法运算,可是在应用中还是不够快。
有没有快速算法解决这个问题?由衷感谢。
...全文
178
3
打赏
收藏
求三维向量组仿射变换的快速算法。
对一组三维向量进行仿射变换,也就是与仿射变换矩阵相乘(4*4)。我是每个向量分别与矩阵相乘的,已经考虑到了仿射变换的特殊性,减少了一些乘法运算,可是在应用中还是不够快。 有没有快速算法解决这个问题?由衷感谢。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
3 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
pulley
2003-09-24
打赏
举报
回复
刚才贴的是错的,应该是这个:
typedef double TMatrix[4][4];
typedef double TVector3d[3];
enum {SizeOfMatrixElmt = 8, SizeOfVectorElmt = 8};
void VectorsMulMatrix(TVector3d* FirstVector, int Count, const TMatrix * AMatrix)
{
__asm
{
LVECT_BEGIN:
MOV EAX, FirstVector;
MOV EDX, Count;
MOV ECX, AMatrix;
FLD QWORD PTR [ECX];
FMUL QWORD PTR [EAX];
FLD QWORD PTR [ECX + SizeOfMatrixElmt];
FMUL QWORD PTR [EAX];
FLD QWORD PTR [ECX + SizeOfMatrixElmt * 2];
FMUL QWORD PTR [EAX];
FLD QWORD PTR [ECX + SizeOfMatrixElmt * 4];
FMUL QWORD PTR [EAX + SizeOfVectorElmt];
FLD QWORD PTR [ECX + SizeOfMatrixElmt * (4 + 1)];
FMUL QWORD PTR [EAX + SizeOfVectorElmt];
FLD QWORD PTR [ECX + SizeOfMatrixElmt * (4 + 2)];
FMUL QWORD PTR [EAX + SizeOfVectorElmt];
FXCH ST(2);
FADDP ST(5), ST(0);
FADDP ST(3), ST(0);
FADDP ST(1), ST(0);
FLD QWORD PTR [ECX + SizeOfMatrixElmt * 4 * 2];
FMUL QWORD PTR [EAX + SizeOfVectorElmt * 2];
FLD QWORD PTR [ECX + SizeOfMatrixElmt * (4 * 2 + 1)];
FMUL QWORD PTR [EAX + SizeOfVectorElmt * 2];
FLD QWORD PTR [ECX + SizeOfMatrixElmt * (4 * 2 + 2)];
FMUL QWORD PTR [EAX + SizeOfVectorElmt * 2];
FXCH ST(2);
FADDP ST(5), ST(0);
FADDP ST(3), ST(0);
FADDP ST(1), ST(0);
FXCH ST(2);
FLD QWORD PTR [ECX + SizeOfMatrixElmt * (4 * 3)];
FADDP ST(1), ST(0)
FXCH ST(1);
FLD QWORD PTR [ECX + SizeOfMatrixElmt * (4 * 3 + 1)];
FADDP ST(1), ST(0);
FXCH ST(2);
FLD QWORD PTR [ECX + SizeOfMatrixElmt * (4 * 3 + 2)];
FADDP ST(1), ST(0);
FXCH ST(1);
FSTP QWORD PTR [EAX];
FSTP QWORD PTR [EAX + SizeOfVectorElmt * 2];
FSTP QWORD PTR [EAX + SizeOfVectorElmt];
LEA EAX, [EAX + SizeOfVectorElmt * 3];
SUB EDX, 1;
JNZ LVECT_BEGIN;
}
}
pulley
2003-09-24
打赏
举报
回复
速度确实很快。谢谢。
我改了一下,改用C,矩阵用double。我把我改的结果也贴上来:
typedef double TMatrix[4][4];
typedef double TVector3d[3];
enum {SizeOfMatrixElmt = 8, SizeOfVectorElmt = 8};
void VectorsMulMatrix(TVector3d* FirstVector, int Count, const TMatrix * AMatrix)
{
__asm
{
LVECT_BEGIN:
MOV EAX, FirstVector;
MOV EDX, Count;
MOV ECX, AMatrix;
FLD TBYTE PTR [ECX];
FMUL QWORD PTR [EAX];
FLD TBYTE PTR [ECX + SizeOfMatrixElmt];
FMUL QWORD PTR [EAX];
FLD TBYTE PTR [ECX + SizeOfMatrixElmt * 2];
FMUL QWORD PTR [EAX];
FLD TBYTE PTR [ECX + SizeOfMatrixElmt * 4];
FMUL QWORD PTR [EAX + SizeOfVectorElmt];
FLD TBYTE PTR [ECX + SizeOfMatrixElmt * (4 + 1)];
FMUL QWORD PTR [EAX + SizeOfVectorElmt];
FLD TBYTE PTR [ECX + SizeOfMatrixElmt * (4 + 2)];
FMUL QWORD PTR [EAX + SizeOfVectorElmt];
FXCH ST(2);
FADDP ST(5), ST(0);
FADDP ST(3), ST(0);
FADDP ST(1), ST(0);
FLD TBYTE PTR [ECX + SizeOfMatrixElmt * 4 * 2];
FMUL QWORD PTR [EAX + SizeOfVectorElmt * 2];
FLD TBYTE PTR [ECX + SizeOfMatrixElmt * (4 * 2 + 1)];
FMUL QWORD PTR [EAX + SizeOfVectorElmt * 2];
FLD TBYTE PTR [ECX + SizeOfMatrixElmt * (4 * 2 + 2)];
FMUL QWORD PTR [EAX + SizeOfVectorElmt * 2];
FXCH ST(2);
FADDP ST(5), ST(0);
FADDP ST(3), ST(0);
FADDP ST(1), ST(0);
FXCH ST(2);
FLD TBYTE PTR [ECX + SizeOfMatrixElmt * (4 * 3)];
FADDP ST(1), ST(0)
FXCH ST(1);
FLD TBYTE PTR [ECX + SizeOfMatrixElmt * (4 * 3 + 1)];
FADDP ST(1), ST(0);
FXCH ST(2);
FLD TBYTE PTR [ECX + SizeOfMatrixElmt * (4 * 3 + 2)];
FADDP ST(1), ST(0);
FXCH ST(1);
FSTP QWORD PTR [EAX];
FSTP QWORD PTR [EAX + SizeOfVectorElmt * 2];
FSTP QWORD PTR [EAX + SizeOfVectorElmt];
LEA EAX, [EAX + SizeOfVectorElmt * 3];
SUB EDX, 1;
JNZ LVECT_BEGIN;
}
}
在VC6中编译运行成功。
短歌如风
2003-09-23
打赏
举报
回复
快速算法我没见过,不过向量乘矩阵是一个高度可并行化的操作,可以通过用汇编代码的方式来充分利用FPU的流水线功能。通过指令顺序的排布,可以达到每条指令一个时钟周期。
我用的一段代码,在D6中实现,fastcall调用方式,第一个参数:EAX,第二个参数:EDX,第三个参数:ECX
矩阵使用80位临时实数格式,向量使用64位长实数格式,你按你的需要改一下吧。
type
TMatrix = array[0..3, 0..3] of Extended;
TVector3d = packed array [0..2] of Double;
procedure VectorsMulMatrix(var FirstVector: TVector3d; Count: Integer;
const AMatrix: TMatrix);
const
SizeOfMatrixElmt = 10;
SizeOfVectorElmt = 8;
asm
@LVECT_BEGIN:
FLD TBYTE PTR [ECX];
FMUL QWORD PTR [EAX];
FLD TBYTE PTR [ECX + SizeOfMatrixElmt];
FMUL QWORD PTR [EAX];
FLD TBYTE PTR [ECX + SizeOfMatrixElmt * 2];
FMUL QWORD PTR [EAX];
FLD TBYTE PTR [ECX + SizeOfMatrixElmt * 4];
FMUL QWORD PTR [EAX + SizeOfVectorElmt];
FLD TBYTE PTR [ECX + SizeOfMatrixElmt * (4 + 1)];
FMUL QWORD PTR [EAX + SizeOfVectorElmt];
FLD TBYTE PTR [ECX + SizeOfMatrixElmt * (4 + 2)];
FMUL QWORD PTR [EAX + SizeOfVectorElmt];
FXCH ST(2);
FADDP ST(5), ST(0);
FADDP ST(3), ST(0);
FADDP ST(1), ST(0);
FLD TBYTE PTR [ECX + SizeOfMatrixElmt * 4 * 2];
FMUL QWORD PTR [EAX + SizeOfVectorElmt * 2];
FLD TBYTE PTR [ECX + SizeOfMatrixElmt * (4 * 2 + 1)];
FMUL QWORD PTR [EAX + SizeOfVectorElmt * 2];
FLD TBYTE PTR [ECX + SizeOfMatrixElmt * (4 * 2 + 2)];
FMUL QWORD PTR [EAX + SizeOfVectorElmt * 2];
FXCH ST(2);
FADDP ST(5), ST(0);
FADDP ST(3), ST(0);
FADDP ST(1), ST(0);
FXCH ST(2);
FLD TBYTE PTR [ECX + SizeOfMatrixElmt * (4 * 3)];
FADDP ST(1), ST(0)
FXCH ST(1);
FLD TBYTE PTR [ECX + SizeOfMatrixElmt * (4 * 3 + 1)];
FADDP ST(1), ST(0);
FXCH ST(2);
FLD TBYTE PTR [ECX + SizeOfMatrixElmt * (4 * 3 + 2)];
FADDP ST(1), ST(0);
FXCH ST(1);
FSTP QWORD PTR [EAX];
FSTP QWORD PTR [EAX + SizeOfVectorElmt * 2];
FSTP QWORD PTR [EAX + SizeOfVectorElmt];
LEA EAX, [EAX + SizeOfVectorElmt * 3];
SUB EDX, 1;
JNZ @LVECT_BEGIN;
end;
详解Python计算机视觉 图像扭曲(仿射扭曲)
对图像块应用
仿射变换
,我们将其称为图像扭曲(或者仿射扭曲)。该操作不仅经常应用在计算机图形学中,而且经常出现在计算机视觉
算法
中。...在有限维的情况,每个
仿射变换
可以由一个矩阵A和一个
向量
b给出,它
2017年人脸检测、人脸对齐、人脸识别源码
对齐过程可以采用二维或
三维
变换,如
仿射变换
或投影变换,确保所有人脸都以统一的方式呈现。 3. **人脸识别**: 人脸识别是通过比较两张或多张人脸图像来确认或验证个体身份的技术。它分为两个主要阶段:特征提取...
三维
错切变换矩阵_Android OpenCV(十一):图像
仿射变换
仿射变换
仿射变换
,又称仿射映射,是指在几何中,一个
向量
空间进行一次线性变换并接上一个平移,变换为另一个
向量
空间。
仿射变换
能够保持图像的“平直性”,包括旋转,缩放,平移,错切操作。一般而言,
仿射变换
...
【视觉高级篇】22 # 如何用
仿射变换
来移动和旋转3D物体?
让
三维
向量
乘上标量,就相当于乘上要缩放的倍数。可以使用齐次矩阵来表示
三维
仿射变换
,通过引入一个新的维度,就可以把
仿射变换
转换为齐次矩阵的线性变换。
三维
物体的旋转变换比较复杂一点,下面先了解一下欧拉角。...
3D
仿射变换
矩阵推导
仿射变换
包括线性变换和平移变换,先来说线性变换中的旋转变换,这个稍微要复杂一点.讲这个之前,我假设你已经对线性代数有一定的了解,比如三角函数,
向量
,以及矩阵的相关知识(以及他们所代表的几何意义),如果以上知识不...
数据结构与算法
33,028
社区成员
35,337
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章