如果我们考虑大小为pxp的矩阵R.如果我们想要乘以A等于(I + Givens旋转)的A' RA。在这里,我是一个单位矩阵和'表示转置运算符。
我们知道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。那么,有人可以帮我理解这段代码吗?
答案 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=2
,jk=4
,无论是完整形式还是稀疏形式):
除了(ik
,jk
)2d子空间之外,您可以看到,此矩阵是一个单位矩阵,其他所有维度都保持不变。因此R*A'
的操作会为R
和ik
列的除之外的每个维<{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'
相乘。同样,沿大多数维度(行,这次)的效果将是标识,但在行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
矩阵,它再次清楚在快速实现&#34;中执行相同的操作。代码。
免责声明:R*A'
是matlab中的伴随(共轭转置),因此您应该使用A'
来引用转置。对于复杂矩阵而言,存在巨大差异,人们在最终遇到复杂矩阵时常常忘记使用正确的转置。