使用 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=2
,jk=4
,完整和稀疏形式):
可以看到除了(ik
,jk
)的2d子空间,这个矩阵都是单位矩阵,其他维度都保持原样。因此 R*A'
的操作将导致 R
每个维度 除了 列 ik
和 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
矩阵的含义。所有这一切都意味着 A
矩阵是除 2d 子空间之外的单位矩阵。
下一步非常相似:使用这个新的 R*A'
矩阵,我们从 左边 乘以 A
。同样,大多数维度(行,这次)的效果将是相同的,但在行 ik
和 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*A'
覆盖了 R
矩阵,再次清楚地表明在 "fast implementation" 代码中执行了相同的操作。
免责声明:A'
是matlab中的伴随(共轭转置),所以你应该用A.'
来指代转置。对于复杂的矩阵有很大的不同,人们在最终遇到复杂的矩阵时常常忘记使用适当的转置。
如果我们考虑一个大小为 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=2
,jk=4
,完整和稀疏形式):
可以看到除了(ik
,jk
)的2d子空间,这个矩阵都是单位矩阵,其他维度都保持原样。因此 R*A'
的操作将导致 R
每个维度 除了 列 ik
和 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
矩阵的含义。所有这一切都意味着 A
矩阵是除 2d 子空间之外的单位矩阵。
下一步非常相似:使用这个新的 R*A'
矩阵,我们从 左边 乘以 A
。同样,大多数维度(行,这次)的效果将是相同的,但在行 ik
和 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*A'
覆盖了 R
矩阵,再次清楚地表明在 "fast implementation" 代码中执行了相同的操作。
免责声明:A'
是matlab中的伴随(共轭转置),所以你应该用A.'
来指代转置。对于复杂的矩阵有很大的不同,人们在最终遇到复杂的矩阵时常常忘记使用适当的转置。