# HG changeset patch # User Jaroslav Hajek # Date 1238999629 -7200 # Node ID 8be05554bbd0b5a3d1185291cbe31ea8a3102047 # Parent 38c3a0f8c6d0c58909700c48814d9d39f4f65a7d optimize vech diff -r 38c3a0f8c6d0 -r 8be05554bbd0 scripts/ChangeLog --- a/scripts/ChangeLog Mon Apr 06 08:33:13 2009 +0200 +++ b/scripts/ChangeLog Mon Apr 06 08:33:49 2009 +0200 @@ -1,3 +1,7 @@ +2009-04-06 Jaroslav Hajek + + * linear-algebra/vech.m: Optimize. + 2009-04-06 Jaroslav Hajek * special-matrix/toeplitz.m: Optimize. diff -r 38c3a0f8c6d0 -r 8be05554bbd0 scripts/linear-algebra/vech.m --- a/scripts/linear-algebra/vech.m Mon Apr 06 08:33:13 2009 +0200 +++ b/scripts/linear-algebra/vech.m Mon Apr 06 08:33:49 2009 +0200 @@ -1,5 +1,6 @@ ## Copyright (C) 1995, 1996, 1997, 1999, 2000, 2002, 2005, 2006, 2007, 2008 ## Kurt Hornik +## Copyright (C) 2009 VZLU Prague ## ## This file is part of Octave. ## @@ -41,16 +42,9 @@ error ("vech: x must be square"); endif - ## This should be quicker than having an inner `for' loop as well. - ## Ideally, vech should be written in C++. n = rows (x); - v = zeros ((n+1)*n/2, 1); - count = 0; - for j = 1 : n - i = j : n; - v (count + i) = x (i, j); - count = count + n - j; - endfor + slices = cellslices (x(:), (1:n) + n*(0:n-1), n*(1:n)); + v = vertcat (slices{:}); endfunction