グラムシュミットの直交化

dora.bk.tsukuba.ac.jp
Matlabでの実装

clear; close all;

a1 = [1 1 0]';
a2 = [0 -1 1]';
a3 = [1 1 1]';

e1 = a1/norm(a1)
e2 = a2 - dot(a2,e1)*e1;
e2 = e2/norm(e2)
e3 = a3 - dot(a3,e1)*e1  - dot(a3,e2)*e2;
e3 = e3/norm(e3)
% dot(e1,e2)
% dot(e1,e3)
% dot(e2,e3)

es = gram_schmidt([a1 a2 a3]);
es

function es = gram_schmidt(vectors)
  a1 = vectors(:,1);
  dim = size(vectors);
  m = dim(1);
  n = dim(2);
  as = zeros(m,n);
  es = zeros(m,n);
  e1 = a1/norm(a1);  
  as(:,1) = a1;
  es(:,1) = e1;
  for idx=2:length(vectors)
      ai = vectors(:,idx);
      as(:,idx) = ai;
      ei = ai;
      for jdx = 1:idx
          ei = ei - dot(as(:,idx),es(:,jdx))*es(:,jdx);
      end
      ei = ei/norm(ei);
      es(:,idx) = ei;
  end

end

実行結果 

e1 =
    0.7071
    0.7071
         0
e2 =
    0.4082
   -0.4082
    0.8165
e3 =
   -0.5774
    0.5774
    0.5774
es =
    0.7071    0.4082   -0.5774
    0.7071   -0.4082    0.5774
         0    0.8165    0.5774