使用Givens轮换

时间:2015-07-12 09:23:18

标签: matlab math rotation matrix-multiplication rotational-matrices

如果我们考虑大小为pxp的矩阵R.如果我们想要乘以A等于(I + Givens旋转)的A' RA。在这里,我是一个单位矩阵和'表示转置运算符。

我们知道Givens旋转是一个稀疏矩阵,写成:

enter image description here

要在matlab中执行乘法A' RA,我们可以快速实现:

%Fast implementation
  ci = R(:,ik)*(cos(theta))+R(:,jk)*(sin(theta)); % R*A
  cj = R(:,jk)*(cos(theta)) - R(:,ik)*(sin(theta));
  R(:,ik) = ci;
  R(:,jk) = cj;

  ri = R(ik,:)*(cos(theta))+R(jk,:)*(sin(theta)); % A'*R*A
  rj = R(jk,:)*(cos(theta)) - R(ik,:)*(sin(theta));
  R(ik,:) = ri;  
  R(jk,:) = rj;

但我不明白他们是如何编写这个Matlab代码的。换句话说,我不理解这个Matlab代码如何应用乘法A' RA。那么,有人可以帮我理解这段代码吗?

1 个答案:

答案 0 :(得分:2)

混淆的一个可能原因是,在你的例子中,Givens旋转矩阵中的符号,我们需要转置的那一侧是错误的。我将假设后者:我将使用与您定义的相同的A矩阵,但使用A*R*A'进行转换(将A更改为转置相当于采用旋转角度符号相反)。

算法相对简单。首先,正如代码中的注释所示,转换分两步执行:

Rnew = A * R * A' = A * (R * A')

首先,我们计算R*A'。为此,想象使用Givens旋转矩阵A = I + M的变换矩阵M。你展示的公式基本上是说"取一个单位矩阵,除了你旋转给定角度的2个指定尺寸"。以下是完整的A矩阵对于一个小问题的看法(6d矩阵,ik=2jk=4,无论是完整形式还是稀疏形式):

full A matrix sparse A matrix

除了(ikjk)2d子空间之外,您可以看到,此矩阵是一个单位矩阵,其他所有维度都保持不变。因此R*A'的操作会为Rik列的之外的每个维<{1}}生成。

在这两列中,jk的结果是R*A'R(:,ik)与这些三角系数的线性组合:

R(:,jk)

而其余列保持不变。如果你看一下你引用的代码:这正是它所做的。根据定义,这是[R*A'](:,ik) = R(:,ik)*cos(theta) + R(:,jk)*sin(theta) [R*A'](:,jk) = -R(:,ik)*sin(theta) + R(:,jk)*cos(theta) 对上面显示的R*A'矩阵的含义。所有这一切都意味着A矩阵是一个单位矩阵,除了2d子空间。

下一步非常相似:使用这个新的A矩阵,我们将 left R*A'相乘。同样,沿大多数维度(行,这次)的效果将是标识,但在行Aik中我们再次获得线性组合:

jk

通过注意代码在第一步之后用[A*[R*A']](ik,:) = cos(theta)*[R*A'](ik,:) + sin(theta)*[R*A'](jk,:) [A*[R*A']](jk,:) = -sin(theta)*[R*A'](ik,:) + cos(theta)*[R*A'](jk,:) 覆盖R矩阵,它再次清楚在快速实现&#34;中执行相同的操作。代码。

免责声明:R*A'是matlab中的伴随(共轭转置),因此您应该使用A'来引用转置。对于复杂矩阵而言,存在巨大差异,人们在最终遇到复杂矩阵时常常忘记使用正确的转置。