Diagonal v. sparse matrices [was Re: deprecated functions]

John W. Eaton jwe at octave.org
Wed Mar 4 15:17:13 CST 2009


On  4-Mar-2009, Jaroslav Hajek wrote:

| Nope, I didn't break compatibility that much :) This is, in fact, the
| standard Matlab way to create a sparse diagonal matrix. It would be
| nice, however, to be able to write this as sparse(diag()) as well
| without losing efficiency. It seems Jason is working on something
| along that lines, so I'd leave it to him. Note that the proper
| constructors are already defined in liboctave.

What do you mean by "without losing efficiency"?  Does

  a = diag (...);
  sparse (a);

convert A to full first, then sparse?  If so, it seems that should be
fairly easy to fix.  In any case, I think the following change should
be made to spdiag.  This is much simpler than having to check
arguments in spdiag, and will be efficient if the "sparse (diag)"
constructor is fixed.  But the important thing is that for
compatibility with previous versions of Octave, spdiag returns a
sparse matrix, not a diag matrix.  Do you agree?

diff --git a/scripts/deprecated/spdiag.m b/scripts/deprecated/spdiag.m
--- a/scripts/deprecated/spdiag.m
+++ b/scripts/deprecated/spdiag.m
@@ -28,9 +28,9 @@
   if (! warned)
     warned = true;
     warning ("Octave:deprecated-function",
-	     "spdiag is obsolete and will be removed from a future version of Octave; please use diag instead");
+	     "spdiag is obsolete and will be removed from a future version of Octave; please use sparse (diag (...)) instead");
   endif
 
-  retval = diag (varargin{:});
+  retval = sparse (diag (varargin{:}));
 
 endfunction


jwe



More information about the Octave-maintainers mailing list