changeset 9460:eaf8d8b17162 octave-forge

control-devel: improve dimension checks of set arguments
author paramaniac
date Wed, 22 Feb 2012 10:03:24 +0000
parents 0d7439781ee5
children e841a8fa6b26
files extra/control-devel/devel/test_iddata.m extra/control-devel/inst/@iddata/set.m
diffstat 2 files changed, 23 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/extra/control-devel/devel/test_iddata.m	Tue Feb 21 20:48:08 2012 +0000
+++ b/extra/control-devel/devel/test_iddata.m	Wed Feb 22 10:03:24 2012 +0000
@@ -4,4 +4,10 @@
 
 b = iddata ({(1:10).', (21:30).'}, [])
 
-c = iddata ({(1:10).', (21:40).'}, {(31:40).', (41:60).'})
\ No newline at end of file
+c = iddata ({(1:10).', (21:40).'}, {(31:40).', (41:60).'})
+
+x = c;
+%x.y = {}
+
+%x.u = []
+x.u = x.y
\ No newline at end of file
--- a/extra/control-devel/inst/@iddata/set.m	Tue Feb 21 20:48:08 2012 +0000
+++ b/extra/control-devel/inst/@iddata/set.m	Wed Feb 22 10:03:24 2012 +0000
@@ -42,11 +42,11 @@
 
     disp (str);
 
-    if (nargout != 0)    # function dat = set (dat, varargin)
-      retdat = dat;      # would lead to unwanted output when using
-    endif                # set (dat)
+    if (nargout != 0)       # function dat = set (dat, varargin)
+      retdat = dat;         # would lead to unwanted output when using
+    endif                   # set (dat)
 
-  else                   # set (dat, "prop1", val1, ...), sys = set (dat, "prop1", val1, ...)
+  else                      # set (dat, "prop1", val1, ...), dat = set (dat, "prop1", val1, ...)
 
     if (rem (nargin-1, 2))
       error ("iddata: set: properties and values must come in pairs");
@@ -61,11 +61,20 @@
       switch (prop)
         case {"y", "outdata", "outputdata"}
           val = __adjust_iddata__ (val, dat.u);
-          __iddata_dim__ (val, dat.u);
+          [pval, ~, eval] = __iddata_dim__ (val, dat.u);
+          if (pval != p)
+            error ("iddata: set: argument has %d instead of %d outputs", pval, p);
+          endif
+          if (eval != e)    # iddata_dim is not sufficient if dat.u = []
+            error ("iddata: set: argument has %d instead of %d experiments", eval, e);
+          endif
           dat.y = val;
         case {"u", "indata", "inputdata"}
           [~, val] = __adjust_iddata__ (dat.y, val);
-          __iddata_dim__ (dat.y, val);
+          [~, mval] = __iddata_dim__ (dat.y, val);
+          if (mval != m)
+            error ("iddata: set: argument has %d instead of %d inputs", mval, m);
+          endif
           dat.u = val;
         case {"outname", "outputname"}
           dat.outname = __adjust_labels__ (val, p);
@@ -116,7 +125,7 @@
       endswitch
     endfor
 
-    if (nargout == 0)    # set (sys, "prop1", val1, ...)
+    if (nargout == 0)    # set (dat, "prop1", val1, ...)
       assignin ("caller", inputname (1), dat);
     else                 # dat = set (dat, "prop1", val1, ...)
       retdat = dat;