Mercurial > hg > octave-lyh
diff scripts/polynomial/polyvalm.m @ 8903:c174a1fc3fde
reimplement polyvalm using Horner
author | Jaroslav Hajek <highegg@gmail.com> |
---|---|
date | Tue, 03 Mar 2009 11:56:51 +0100 |
parents | 6f2d95255911 |
children | eb63fbe60fab |
line wrap: on
line diff
--- a/scripts/polynomial/polyvalm.m +++ b/scripts/polynomial/polyvalm.m @@ -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]);