rbmatlab  1.16.09
 All Classes Namespaces Files Functions Variables Modules Pages
orthonormalize_old.m
1 function onvec = orthonormalize_old(vec,A)
2 % function onvec = orthonormalize_old(vec[,A])
3 %
4 % Gram-Schmidt orthonormalization of vectors in columns of
5 % matrix vec to onvec. Almost zero vectors are set to zero.
6 % the inner product matrix A can be specified additionally, i.e.
7 % <x,x> = x' * A * x;
8 
9 % Bernard Haasdonk 13.6.2002
10 
11 epsilon = 1e-10;
12 %epsilon = 1e-12; -> This causes error by returning non-orthogonal
13 % vectors (e.g. two identical vectors)
14 % So take epsilon larger than 1e-12!
15 
16 if isempty(vec)
17  onvec = zeros(size(vec));
18  return;
19 end;
20 
21 if nargin<2
22  A = 1;
23 end;
24 
25 % check on identity of vectors (can happen, that numerics does not detect
26 % this afterwards due to rounding errors!!)
27 
28 for i=1:(size(vec,2)-1)
29  for j=(i+1):size(vec,2)
30  if isequal(vec(:,i),vec(:,j))
31  vec(:,j) = 0;
32  end;
33  end;
34 end;
35 
36 onvec = vec;
37 
38 A_mult_onvec = zeros(size(onvec,1),0);
39 for i = 1:size(vec,2);
40  % orthogonalize vector i
41  for j=1:(i-1)
42  % onvec(:,i)= onvec(:,i)-(onvec(:,i)'*A*onvec(:,j))*onvec(:,j);
43  onvec(:,i)= onvec(:,i)-(onvec(:,i)'*A_mult_onvec(:,j))*onvec(:,j);
44  end;
45  % normalize vector i
46  n = sqrt(onvec(:,i)' * A * onvec(:,i));
47  if (n<epsilon)
48  onvec(:,i) = 0;
49  else
50  onvec(:,i) = onvec(:,i)/n;
51  end;
52  A_mult_onvec = [A_mult_onvec, A*onvec(:,i)];
53 end;
54 
55 %resort zero-columns to back
56 %nsqr = sum(onvec.^2);
57 %[s,i] = sort(-nsqr);
58 %onvec = onvec(:,i);
59 
60 % TO BE ADJUSTED TO NEW SYNTAX
61 %| \docupdate