可以使用旋转矩阵将2D向量旋转角度$ \ theta $:
\ begin {bmatrix}
\ cos(\ theta)&-\ sin(\ theta)\\
\ sin(\ theta)&\ cos(\ theta)
\ end {bmatrix}

或者,可以通过将向量乘以复数$ c $来旋转它:

$$ c = \ cos(\ theta)+ i \ sin(\ theta)$$

这两种方法之间是否存在有意义的区别?我在MATLAB中都进行了测试,它们似乎以相同的速度运行。

在相关说明中,复数是否可以进行某些空间变换而矩阵不能进行?

#1 楼

分解时,这两种方法最终都会进行相同的计算。

使用矩阵旋转向量$ u $:
$$ \ begin {bmatrix} \ cos \ theta&-\ sin \ theta \\ \ sin \ theta和\ cos \ theta \ end {bmatrix} \ begin {bmatrix} u_x \\ u_y \ end {bmatrix} =
\ begin {bmatrix} u_x \ cos \ theta-u_y \ sin \ theta \\ u_x \ sin \ theta + u_y \ cos \ theta \ end {bmatrix} $$

使用复数旋转向量$ u $:
$$ \ begin {aligned}
(\ cos \ theta + i \ sin \ theta)(u_x + iu_y)&= u_x \ cos \ theta + iu_y \ cos \ theta + iu_x \ sin \ theta-u_y \ sin \ theta \ \
&=(u_x \ cos \ theta-u_y \ sin \ theta)+ i(u_x \ sin \ theta + u_y \ cos \ theta)
\ end {aligned} $$

我不希望任何一个都比另一个快或慢,因为它们最终都会执行相同的一组基本运算,即4个乘加2个。

,当数组中存储大量旋转时,复数可能会更快,因为复数只有两个分量而不是四个分量


































br />不。矩阵比复数更通用。任何复数$ z $都可以由矩阵表示为:
$$ \ begin {bmatrix} \ text {Re}(z)&-\ text {Im}(z)\\ \ text {Im} (z)和\ text {Re}(z)\ end {bmatrix} $$
这对应于$ z $阶段的旋转和$ z $大小的缩放。复数只能表示旋转和均匀缩放。矩阵既可以表示那些,也可以表示不均匀的缩放和剪切。另一种看待它的方法是复数只有两个自由度,而2×2矩阵只有四个自由度。

评论


$ \ begingroup $
xforms的处理方式不同:如上所述,将复数转换为矩阵M(2,R)是同构的。加法->加法,乘积->乘积,共轭->转置。所有复杂的操作都可以用这些表达。 zh.wikipedia.org/wiki/2_%C3%97_2_real_matrices
$ \ endgroup $
– MB雷诺兹
16年9月6日在9:46

$ \ begingroup $
使用三角函数会产生一些费用。您可以通过乘以复数来避免使用三角函数。
$ \ endgroup $
– Croco
17年7月28日在14:33

$ \ begingroup $
@CroCo我不认为在任何情况下复数都会使您免于遭受麻烦。例如,您仍然需要三角函数来获取对应于给定角度的单位复数。
$ \ endgroup $
–内森·里德(Nathan Reed)
17年7月28日在17:54

#2 楼

在2D情况下,它简化为相同的计算。无论如何,对于3D,我们都有四元数,它们是具有一个实数和三个虚数分量的多维虚数。四元数具有通过对2个加权四元数求和而使旋转组成线性插值运算的属性。巧妙地解决了空间旋转的某些问题。但是以易懂为代价。

评论


$ \ begingroup $
四元数的问题是文献。大多数标准操作都是戴着小胡子的复数。
$ \ endgroup $
– MB雷诺兹
16-09-6在9:49

$ \ begingroup $
@MBReynolds很好,具有3个独立的虚轴肯定会产生效果。但是,乘法变换却有很多问题。
$ \ endgroup $
– joojaa
16年9月6日在10:27

$ \ begingroup $
您在想些什么?
$ \ endgroup $
– MB雷诺兹
16-9-6上午11:49

#3 楼

在旋转矩阵中,您实际上使用的是三角函数(即具有独立变量称为角度的正弦和余弦),该函数由泰勒级数在内部实现(即具有一定成本)。对于复数,您可以通过将向量(即after表示为复数)乘以表示旋转的复数来避免这种情况。例如,如果您需要旋转矢量(1,0)并使其指向上方(即不需要角度),则基本上将其乘以复数$ z = i $,则旋转后的矢量为(0 ,1)。如您所见,没有使用三角函数。请参阅下面的Matlab代码执行一些旋转操作

clear all
clc

v =  1 + 0i; % vector

z1 =  1 + 1i; % 45  rotation
z2 =  0 + 1i; % 90  rotation
z3 = -1 + 1i; % 135 rotation
z4 = -1 + 0i; % 180 rotation
z5 = -1 - 1i; % 225 rotation
z6 =  1 - 1i; % 270 rotation

%rotate v1 by z deg
v1 = v*z6


但是请记住,对于2D来说,旋转矩阵做得很好,而对于3D来说,复数的重要性通过四元数很重要。

评论


$ \ begingroup $
您还可以通过将值直接插入矩阵中来制作特殊角度的旋转矩阵。例如,矩阵$ \ begin {bmatrix} 1&-1 \\ 1&1 \ end {bmatrix} $实现了与复数$ 1 + 1i $相同的旋转和缩放。对于一般角度,您仍然需要具有矩阵或复数的三角函数。
$ \ endgroup $
–内森·里德(Nathan Reed)
17年7月29日在4:28