使用 Givens 旋转

Working with Givens rotations

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

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

要在 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。请问有人可以帮助我理解这段代码吗?

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

该算法相对简单。对于初学者,如代码中的注释所示,转换分两步执行:

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

首先,我们计算R*A'。为此,想象一下变换矩阵 A = I + M 和 Givens 旋转矩阵 M。您显示的公式基本上是 "Take a unit matrix, except for 2 specified dimensions in which you rotate by a given angle"。这是一个小问题的完整 A 矩阵的样子(6d 矩阵,ik=2jk=4,完整和稀疏形式):

可以看到除了(ik,jk)的2d子空间,这个矩阵都是单位矩阵,其他维度都保持原样。因此 R*A' 的操作将导致 R 每个维度 除了 ikjk.

在这两列中,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 矩阵的含义。所有这一切都意味着 A 矩阵是除 2d 子空间之外的单位矩阵。

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

[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*A' 覆盖了 R 矩阵,再次清楚地表明在 "fast implementation" 代码中执行了相同的操作。

免责声明:A'是matlab中的伴随(共轭转置),所以你应该用A.'来指代转置。对于复杂的矩阵有很大的不同,人们在最终遇到复杂的矩阵时常常忘记使用适当的转置。