2

我正在寻求帮助,以概括我在 Householder QR 分解的第一步中所做的代码。我做了以下事情:

A=[60,41,-88;42,60,51;0,-28,56;126,82,-71];
disp(A)
m=length(A(:,1));
n=length(A(1,:));
I=eye(m);
e1=I(:,1)';

    %We compute the first step of the method.
    beta=-sqrt(A(:,1)'*A(:,1));
    y=A(:,1)'-beta.*e1;
    alpha=sqrt(2)/(sqrt(y*y'));
    v=alpha*y;
    U=I-(v'*v);
    disp(U)
    R1=U*A;
    disp(R1)

我已经尝试了以下步骤来完成其余的步骤:

for k=2:n
  ek=I(:,k)';
 for j=0:k
  beta=-sqrt(R1(k+j,k)'*R1(k+j,k));
   end
   disp(beta)
end

%For the standard basis just define A=eye(N), so the vectors are
%A(:,i).

但它没有用,它给出了一个错误,说明如下:

尝试访问 R1(5,3);索引超出范围,因为 size(R1)=[4,3]。

Householderfactorization 中的错误(第 33 行) beta=-sqrt(R1(k+j,k)'*R1(k+j,k));

所以我一直在尝试寻找另一种获取算法的方法,但我无法弄清楚如何做到这一点,我已经阅读了 Kincaid & Cheney 第一版的“数值分析”一书以获得澄清,但在阅读之后我更加困惑(我想执行书中的算法,因为它是我发现的最简单的算法,尽管有点令人困惑)。

有人可以帮我以正确的方式执行这个算法吗?

注意:这本书可以在这里找到,实际上是在第 253 页。所以问题是我想将第一个之后的部分的算法翻译成 MATLAB 代码(我说的是泛化),而该算法存在的问题是,当您要计算第二步并前进时,您必须考虑先前的矩阵,然后您必须将 A(:,1) 更改为 [R1(2,2),R1 (3,2),R1(4,2)]',然后使用这个新向量计算你在第一步中所做的一切,所以这个过程是我不知道如何将其转换为 MATLAB 的过程。第一步很容易,其他的对我来说很难。

4

0 回答 0