function G = findG(Rhat)

[F,D] = size(Rhat); F = F/2;

% Build matrix Q such that Q * v = [1,...,1,0,...,0] where v is a six
% element vector containg all six distinct elements of the Matrix C

%clear Q
for f = 1:F,
  g = f + F;
  h = g + F;
  Q(f,:) = zt2(Rhat(f,:), Rhat(f,:));
  Q(g,:) = zt2(Rhat(g,:), Rhat(g,:));
  Q(h,:) = zt2(Rhat(f,:), Rhat(g,:));
end

% Solve for v
rhs = [ones(2*F,1); zeros(F,1)];
v = Q \ rhs;

% C is a symmetric 3x3 matrix such that C = G * transpose(G)
n = 1;
for x = 1:D,
  for y = x:D,
    C(x,y) = v(n); C(y,x) = v(n);
    n = n+1;
  end;
end;

e = eig(C);
%disp(e)

if (any(e<= 0)),
  [uu,dd,vv] = svd(C);
  G = uu*sqrt(dd);
  cc = G*G';
  err = sum((cc(:)-C(:)).^2);
  %if err>0.03,
  if 0 & err>30,
    G = [];
    dbstack; keyboard
  end;
else
  G = sqrtm(C);
end

%neg = 0;
%if e(1) <= 0, neg = 1; end
%if e(2) <= 0, neg = 1; end
%if e(3) <= 0, neg = 1; end
%if neg == 1, G = [];
%else G = sqrtm(C);
%end

%-------------------------------------------------

function M = zt2(i,j)

  D = length(i);
  M = [];
  for x = 1:D,
    for y = x:D,
      if x==y, M = [M, i(x)*j(y)]; 
      else,    M = [M, i(x)*j(y)+i(y)*j(x)];
      end;
    end;
  end;