changeset 8903:c174a1fc3fde

reimplement polyvalm using Horner
author Jaroslav Hajek <highegg@gmail.com>
date Tue, 03 Mar 2009 11:56:51 +0100
parents 5d5db7a347c6
children 4de5544a1d1d
files scripts/ChangeLog scripts/polynomial/polyvalm.m
diffstat 2 files changed, 16 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/scripts/ChangeLog	Tue Mar 03 08:01:07 2009 +0100
+++ b/scripts/ChangeLog	Tue Mar 03 11:56:51 2009 +0100
@@ -1,3 +1,7 @@
+2009-03-03  Jaroslav Hajek  <highegg@gmail.com>
+
+	* polynomial/polyval.m: Implement using Horner scheme.
+
 2009-03-03  Ben Abbott <bpabbott@mac.com>
 
 	* plot/gnuplot_drawnow.m: Fix unintended shift of plot image for
--- a/scripts/polynomial/polyvalm.m	Tue Mar 03 08:01:07 2009 +0100
+++ b/scripts/polynomial/polyvalm.m	Tue Mar 03 11:56:51 2009 +0100
@@ -1,5 +1,6 @@
 ## Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2002, 2004,
 ##               2005, 2006, 2007 John W. Eaton
+## Copyright (C) 2009 Jaroslav Hajek
 ##
 ## This file is part of Octave.
 ##
@@ -48,22 +49,22 @@
     error ("polyvalm: second argument must be a square matrix");
   endif
 
-  if (isempty (c))
-    y = [];
-    return;
-  endif
-
-  [v, d] = eig (x);
-
-  if (issymmetric (x))
-    y = v * diag (polyval (c, diag (d))) * v';
+  n = length (c);
+  if (n == 0)
+    y = zeros (rows (x), class (x));
   else
-    y = v * (diag (polyval (c, diag (d))) / v);
+    id = eye (rows (x), class (x));
+    y = c(1) * id;
+    for i = 2:n
+      y = y * x + c(i) * id;
+    endfor
   endif
 
 endfunction
 
-%!assert(isempty (polyvalm ([], [1, 2; 3, 4])));
+
+%!assert(! any (polyvalm ([], [1, 2; 3, 4]))(:));
+%!assert(polyvalm ([1, 2, 3, 4], [3, -4, 1; -2, 0, 2; -1, 4, -3]), [117, -124, 11; -70, 36, 38; -43, 92, -45])
 
 %!error polyvalm ([1, 1, 1], [1, 2; 3, 4; 5, 6]);