Reducing a symmetric matrix to a tridiagonal matrix using householder reflectors(MATLAB)

1k Views Asked by At

I am trying to reduce a matrix to a tridiagonal matrix using householder reflectors. This was the code that my professor gave us and I have written it exactly how she wrote it but it is not working for me. I have tried a bunch of different things but have had no luck so far. Any help is appreciated.

function A=tridiag(S)     
  [m,m]=size(S);   
  e1=eye(1);
  
  for k=1:m-2    
    x=S(k+1:m,k); 
    v=x+(sign(x(1))*norm(x,2)*e1);  
    v=v/norm(v,2);
    S(k+1:m,k:m)=S(k+1:m,k:m)-2*v*(v'*S(k+1:m,k:m));
    S(k:m,k+1:m)=S(k:m,k+1:m)-2*(S(k:m,k+1:m)*v)*v'    
  end
end
1

There are 1 best solutions below

0
On

Since it is symmetric you just need

% make a random symmetric matrix
zzz = rand(5);
zzz = zzz + zzz';

Now you can do the reduction via a one-liner;

[q,h] = hess(zzz);

As a bonus you get the transformation matrix;

>> zzz

zzz =

      0.26634      0.23386       1.0189      0.99855       1.1429
      0.23386      0.79852      0.81886      0.52302       1.6085
       1.0189      0.81886       0.8633       0.3879       1.9044
      0.99855      0.52302       0.3879      0.39624      0.54236
       1.1429       1.6085       1.9044      0.54236       1.4757

>> h

h =

      0.11153      -0.3894            0            0            0
      -0.3894     -0.64046     -0.45009            0            0
            0     -0.45009      0.43149     -0.63142            0
            0            0     -0.63142       2.4218      -2.7954
            0            0            0      -2.7954       1.4757

Verify

>> q'*zzz*q - h

ans =

  -2.2204e-16            0  -2.7756e-17     -1.7e-16            0
            0  -3.3307e-16  -6.6613e-16   6.6613e-16   1.1102e-16
   4.1633e-17  -6.6613e-16  -3.8858e-16   4.4409e-16   5.5511e-17
   -2.498e-16   6.6613e-16   4.4409e-16            0  -8.8818e-16
  -1.9956e-17   5.6487e-17   7.1785e-17  -8.8818e-16            0