# HG changeset patch # User Jaroslav Hajek # Date 1236077811 -3600 # Node ID c174a1fc3fde3daba0337f28440d17a8a637fe38 # Parent 5d5db7a347c66341940850f22e4a1b5f30ad21ae reimplement polyvalm using Horner diff -r 5d5db7a347c6 -r c174a1fc3fde scripts/ChangeLog --- 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 + + * polynomial/polyval.m: Implement using Horner scheme. + 2009-03-03 Ben Abbott * plot/gnuplot_drawnow.m: Fix unintended shift of plot image for diff -r 5d5db7a347c6 -r c174a1fc3fde scripts/polynomial/polyvalm.m --- 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]);