author Michael Orlitzky Tue, 26 Mar 2013 00:43:19 +0000 (20:43 -0400) committer Michael Orlitzky Tue, 26 Mar 2013 00:43:19 +0000 (20:43 -0400)
This reverts commit 1a6f56b0dd6750649725b2fd07edb3fe0850a886.

index 5d3e8a0b2e92a1d4d4b54606ab9453b5a96be215..7e15a46513e7333a63f060385f353720745dbc29 100644 (file)
@@ -1,4 +1,4 @@
-function alpha = step_length_positive_definite(g, Q)
+function alpha = step_length_positive_definite(g, Q, p)
%
% Find the minimizer alpha of,
%
@@ -11,33 +11,34 @@ function alpha = step_length_positive_definite(g, Q)
% and ``Q`` is positive-definite.
%
% The closed-form solution to this problem is given in Nocedal and
-  % Wright, (3.55). The direction of steepest descent will always be
-  % the negative gradient direction; this simplified form is given in
-  % Guler.
+  % Wright, (3.55).
%
% INPUT:
%
%   - ``g`` -- The gradient of f at x.
%
%   - ``Q`` -- The positive-definite matrix in the definition of
-  %   ``f`` above.
+  %     ``f`` above.
+  %
+  %   - ``p`` -- The direction in which ``f`` decreases. The line
+  %     along which we minimize f(x + alpha*p).
%
% OUTPUT:
%
-  %   - ``alpha`` -- The value which decreases ``f`` the most.
+  %   - ``alpha`` -- The value which causes ``f`` to decrease the
+  %     most.
%
% NOTES:
%
% All vectors are assumed to be *column* vectors.
%
-  denom = (g' * Q * g);
+  denom = (p' * Q * p);

-  % denom is non-negative, since it's a Q-norm. No need to abs() it.
-  if (denom < eps)
+  if (abs(denom) < eps)
% Catch divide-by-zeros. If denom is effectively zero, set it to
% something tiny instead. This trick is also used in the PCGM.
-    denom = eps;
+    denom = sign(denom)*eps;
end

-  alpha = (g' * g)/denom;
+  alpha = -(g' * p)/denom;
end