changeset 9720:1f2353e3e587 octave-forge

control-devel: quicksave id draft code (2)
author paramaniac
date Thu, 15 Mar 2012 20:04:50 +0000
parents 0583d649c01a
children 0a73915a01c4
files extra/control-devel/src/slident.cc
diffstat 1 files changed, 50 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/extra/control-devel/src/slident.cc	Thu Mar 15 19:24:20 2012 +0000
+++ b/extra/control-devel/src/slident.cc	Thu Mar 15 20:04:50 2012 +0000
@@ -79,7 +79,7 @@
     int nargin = args.length ();
     octave_value_list retval;
     
-    if (nargin != 11)
+    if (nargin != 12)
     {
         print_usage ();
     }
@@ -106,6 +106,7 @@
         
         double rcond = args(9).double_value ();
         double tol = args(10).double_value ();
+        double tolb = args(11).double_value ();
         
 
         if (imeth == 0)
@@ -389,6 +390,34 @@
         int nsmpl = nsmp;
         
         // arguments out
+        lda = max (1, n);
+        ldc = max (1, l);
+        ldb = max (1, n);
+        ldd = max (1, l);
+        ldq = n;            // if JOBCK = 'C' or 'K'
+        ldry = l;           // if JOBCK = 'C' or 'K'
+        lds = n;            // if JOBCK = 'C' or 'K'
+        ldk = n;            // if JOBCK = 'K'
+        
+        Matrix a (lda, n);
+        Matrix c (ldc, n);
+        Matrix b (ldb, m);
+        Matrix d (ldd, m);
+        
+        Matrix q (ldq, n);
+        Matrix ry (ldry, l);
+        Matrix s (lds, l);
+        Matrix k (ldk, l);
+        
+        // workspace
+        int liwork;
+
+        int ldwork;
+
+
+        OCTAVE_LOCAL_BUFFER (int, iwork, liwork);
+        OCTAVE_LOCAL_BUFFER (double, dwork, ldwork);
+
 
         // error indicators
         int iwarn = 0;
@@ -409,7 +438,7 @@
                   ry.fortran_vec (), ldry,
                   s.fortran_vec (), lds,
                   k.fortran_vec (), ldk,
-                  tol,
+                  tolb,
                   iwork,
                   dwork, ldwork,
                   bwork,
@@ -455,8 +484,27 @@
         error_msg ("ident", info, 10, err_msg_b);
         warning_msg ("ident", iwarn, 5, warn_msg_b);
 
+        // resize
+        a.resize (n, n);
+        c.resize (l, n);
+        b.resize (n, m);
+        d.resize (l, m);
+        
+        q.resize (n, n);
+        ry.resize (l, l);
+        s.resize (n, l);
+        k.resize (n, l);
         
         // return values
+        retval(0) = a;
+        retval(1) = b;
+        retval(2) = c;
+        retval(3) = d;
+        
+        retval(4) = q;
+        retval(5) = ry;
+        retval(6) = s;
+        retval(7) = k;
         //retval(0) = octave_value (n);
         //retval(1) = r;
         //retval(2) = sv;