1

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

我们知道,一个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。请问有人可以帮我理解这段代码吗?

回答

2

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

该算法相对简单。对于初学者来说,在代码中的注释表明,改造分两步进行:

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

首先,我们计算R*A'。为此,想象具有Givens旋转矩阵M的变换矩阵A = I + M。您基本上显示的公式表示“采用单位矩阵,除了以给定角度旋转的2个指定尺寸”。下面是完整的A矩阵看起来像一个小问题(6D矩阵,ik=2jk=4,无论是在充分稀疏形式):

full A matrix sparse A matrix

你可以看到,除了(ikjk )二维子空间,这个矩阵是一个单位矩阵,保持其他维度不变。因此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矩阵R*A'在第一步之后,再次清楚的是在“快速实现”代码中执行相同的操作。

声明:A'是matlab中的伴随(共轭转置),因此您应该使用A.'来引用转置。对于复杂的矩阵有很大的区别,当人们最终遇到复杂的矩阵时经常忘记使用正确的转置。

+1

非常感谢你的回答:) – Christina

+0

@Christina随时:) –