[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: goals for 3.1
From: |
David Bateman |
Subject: |
Re: goals for 3.1 |
Date: |
Thu, 20 Mar 2008 20:56:27 +0100 |
User-agent: |
Thunderbird 2.0.0.12 (X11/20080306) |
David Bateman wrote:
> That is what I just implemented.. Will send a patch after I feed the
> kids ...
>
> D.
>
Changeset attached. I implemented the cell diag function in the same
manner as the existing diag function. I will refactor this code later to
get rid of the nest of if/else statements..
D.
# HG changeset patch
# User David Bateman <address@hidden>
# Date 1206042859 -3600
# Node ID 489c110b13859e0ef7008b8b28e365a11ffb7bfd
# Parent 629d90b1961c12d99b42c03a0586c97081869679
Further type preservation tests and fix of diag for cell arrays
diff --git a/scripts/ChangeLog b/scripts/ChangeLog
--- a/scripts/ChangeLog
+++ b/scripts/ChangeLog
@@ -1,4 +1,6 @@ 2008-03-20 David Bateman <address@hidden
2008-03-20 David Bateman <address@hidden>
+
+ * general/tril.m, general/triu.m: Fail if input is a structure.
* miscellaneous/cast.m: Also allow cast to "char".
diff --git a/scripts/general/tril.m b/scripts/general/tril.m
--- a/scripts/general/tril.m
+++ b/scripts/general/tril.m
@@ -67,8 +67,10 @@ function retval = tril (x, k)
function retval = tril (x, k)
if (nargin > 0)
+ if (isstruct (x))
+ error ("tril: structure arrays not supported");
+ endif
[nr, nc] = size (x);
- retval = resize (resize (x, 0), nr, nc);
endif
if (nargin == 1)
@@ -81,6 +83,7 @@ function retval = tril (x, k)
print_usage ();
endif
+ retval = resize (resize (x, 0), nr, nc);
for j = 1 : min (nc, nr+k)
nr_limit = max (1, j-k);
retval (nr_limit:nr, j) = x (nr_limit:nr, j);
diff --git a/scripts/general/triu.m b/scripts/general/triu.m
--- a/scripts/general/triu.m
+++ b/scripts/general/triu.m
@@ -27,10 +27,11 @@ function retval = triu (x, k)
function retval = triu (x, k)
if (nargin > 0)
+ if (isstruct (x))
+ error ("tril: structure arrays not supported");
+ endif
[nr, nc] = size (x);
- retval = resize (resize (x, 0), nr, nc);
endif
-
if (nargin == 1)
k = 0;
elseif (nargin == 2)
@@ -41,6 +42,7 @@ function retval = triu (x, k)
print_usage ();
endif
+ retval = resize (resize (x, 0), nr, nc);
for j = max (1, k+1) : nc
nr_limit = min (nr, j-k);
retval (1:nr_limit, j) = x (1:nr_limit, j);
diff --git a/src/Cell.cc b/src/Cell.cc
--- a/src/Cell.cc
+++ b/src/Cell.cc
@@ -236,6 +236,52 @@ Cell::map (ctype_mapper fcn) const
r[i] = ((p++)->*fcn) ();
return retval;
+}
+
+Cell
+Cell::diag (void) const
+{
+ return diag (0);
+}
+
+Cell
+Cell::diag (octave_idx_type k) const
+{
+ octave_idx_type nnr = rows ();
+ octave_idx_type nnc = cols ();
+ if (k > 0)
+ nnc -= k;
+ else if (k < 0)
+ nnr += k;
+
+ Cell d;
+
+ if (nnr > 0 && nnc > 0)
+ {
+ octave_idx_type ndiag = (nnr < nnc) ? nnr : nnc;
+
+ d.resize (dim_vector (ndiag, 1));
+
+ if (k > 0)
+ {
+ for (octave_idx_type i = 0; i < ndiag; i++)
+ d.elem (i) = elem (i, i+k);
+ }
+ else if (k < 0)
+ {
+ for (octave_idx_type i = 0; i < ndiag; i++)
+ d.elem (i) = elem (i-k, i);
+ }
+ else
+ {
+ for (octave_idx_type i = 0; i < ndiag; i++)
+ d.elem (i) = elem (i, i);
+ }
+ }
+ else
+ error ("diag: requested diagonal out of range");
+
+ return d;
}
/*
diff --git a/src/Cell.h b/src/Cell.h
--- a/src/Cell.h
+++ b/src/Cell.h
@@ -115,6 +115,9 @@ public:
static octave_value resize_fill_value (void) { return Matrix (); }
+ Cell diag (void) const;
+ Cell diag (octave_idx_type k) const;
+
Cell xisalnum (void) const { return map (&octave_value::xisalnum); }
Cell xisalpha (void) const { return map (&octave_value::xisalpha); }
Cell xisascii (void) const { return map (&octave_value::xisascii); }
diff --git a/src/ChangeLog b/src/ChangeLog
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,15 @@ 2008-03-18 David Bateman <address@hidden
+2008-03-20 David Bateman <address@hidden>
+
+ * data.cc (static octave_value make_diag (const Cell&,
+ octave_idx_type)): New instantiation of template function.
+ (static octave_value make_diag (const octave_value&,
+ octave_idx_type)): Allow cell arrays.
+
+ * Cell.cc (Cell Cell::diag (void) const, Cell Cell::diag
+ (octave__idx_type)): New methods for diagonal matrices.
+ * Cell.h (Cell Cell::diag (void) const, Cell Cell::diag
+ (octave__idx_type)): Declare them.
+
2008-03-18 David Bateman <address@hidden>
* ov-re-mat.cc (lgamma): Convert to a allow negative arguments.
diff --git a/src/data.cc b/src/data.cc
--- a/src/data.cc
+++ b/src/data.cc
@@ -976,6 +976,9 @@ make_diag (const uint32NDArray& v, octav
static octave_value
make_diag (const uint64NDArray& v, octave_idx_type k);
+
+static octave_value
+make_diag (const Cell& v, octave_idx_type k);
#endif
template <class T>
@@ -1150,6 +1153,8 @@ make_diag (const octave_value& a, octave
retval = make_diag (a.uint32_array_value (), k);
else if (result_type == "uint64")
retval = make_diag (a.uint64_array_value (), k);
+ else if (result_type == "cell")
+ retval = make_diag (a.cell_value (), k);
else
gripe_wrong_type_arg ("diag", a);
diff --git a/test/ChangeLog b/test/ChangeLog
--- a/test/ChangeLog
+++ b/test/ChangeLog
@@ -1,4 +1,6 @@ 2008-03-20 David Bateman <address@hidden
2008-03-20 David Bateman <address@hidden>
+
+ * test_func.m: Modify to test for char, cell and structure arrays.
* test_func.m: New test code that ensures that all operations
which work on dimensions alone (squeeze, triu, etc.) work for all
diff --git a/test/test_func.m b/test/test_func.m
--- a/test/test_func.m
+++ b/test/test_func.m
@@ -22,34 +22,29 @@
## not to check that the function itself returns teh correct result,
## just that the results are consistent for all types.
-%!function __fntestfunc__ (fn, min, varargin)
+%!function __fntestfunc__ (fn, mn, varargin)
%! typ = {'double', 'complex', 'logical', 'sparse', 'complex sparse', ...
%! 'logical sparse', 'int8', 'int16', 'int32', 'int64', 'uint8', ...
-%! 'uint16', 'uint32', 'uint64'};
+%! 'uint16', 'uint32', 'uint64', 'char', 'cell', 'struct'};
%!
%! cmplx = [2, 5];
%! nlogical = [3, 6];
%! ninteger = [7, 8, 9, 10, 11, 12, 13, 14];
%! nsparse = [4, 5, 6];
-%! usesparse = true;
+%! skip = {};
%!
-%! if (length (varargin) > 0 && islogical (varargin{1}))
-%! usesparse = varargin{1};
+%! if (length (varargin) > 0 && iscell (varargin{1}))
+%! skip = varargin{1};
%! varargin(1) = [];
%! endif
%!
%! for i = 1 : length(typ)
-%! m = min;
-%! if (length (varargin) > 0)
-%! args = varargin(1);
-%! else
-%! args = {};
+%! if (any (strcmp (skip, typ {i})))
+%! continue;
%! endif
+%! m = mn;
%!
%! if (any (nsparse == i))
-%! if (! usesparse)
-%! continue;
-%! endif
%! if (ndims (m) > 2)
%! sz = size (m);
%! m = reshape (m, [sz(1), prod(sz (2:end))]);
@@ -70,12 +65,21 @@
%! if (any (ninteger == i))
%! m = cast (m, typ{i});
%! endif
+%! if (strcmp (typ{i}, 'cell'))
+%! m = num2cell (m);
+%! elseif (strcmp (typ{i}, 'struct'))
+%! m = struct ('fld', num2cell (m));
+%! endif
%!
-%! y = feval (fn, m, args{:});
+%! y = feval (fn, m, varargin{:});
+%! y2 = feval (fn, reshape (mn, size (m)), varargin{:});
%! if (!strcmp (class (y), class (m)) ||
-%! issparse (y) != issparse (m) ||
-%! any (cast (real (y), 'double')(:) !=
-%! feval (fn , cast (real (m), 'double'), args{:})(:)))
+%! issparse (y) != issparse (m) || !size_equal (y, y2))
+%! error ('failed for type %s\n', typ{i});
+%! endif
+%! if (!(strcmp (typ{i}, 'cell') || strcmp (typ{i}, 'struct')) &&
+%! any (vec (cast (real (y), 'double')) !=
+%! vec (feval (fn , cast (real (m), 'double'), varargin{:}))))
%! error ('failed for type %s\n', typ{i});
%! endif
%! endfor
@@ -88,21 +92,21 @@
%! m3 = [];
%!test
-%! __fntestfunc__('triu', m1);
+%! __fntestfunc__('triu', m1, {'struct'});
%!test
-%! __fntestfunc__ ('triu', m1, -1);
+%! __fntestfunc__ ('triu', m1, {'struct'}, -1);
%!test
-%! __fntestfunc__ ('triu', m1, 1);
+%! __fntestfunc__ ('triu', m1, {'struct'}, 1);
%!test
-%! __fntestfunc__('triu', m3);
+%! __fntestfunc__('triu', m3, {'struct'});
%!test
-%! __fntestfunc__ ('tril', m1);
+%! __fntestfunc__ ('tril', m1, {'struct'});
%!test
-%! __fntestfunc__ ('tril', m1, -1);
+%! __fntestfunc__ ('tril', m1, {'struct'}, -1);
%!test
-%! __fntestfunc__ ('tril', m1, 1);
+%! __fntestfunc__ ('tril', m1, {'struct'}, 1);
%!test
-%! __fntestfunc__('tril', m3);
+%! __fntestfunc__('tril', m3, {'struct'});
%!test
%! __fntestfunc__ ('squeeze', m2);
%!test
@@ -110,19 +114,19 @@
%!test
%! __fntestfunc__ ('permute', m1, [2, 1]);
%!test
-%! __fntestfunc__ ('permute', m2, false, [3, 1, 2]);
+%! __fntestfunc__ ('permute', m2, {'sparse', 'logical sparse', 'complex
sparse'}, [3, 1, 2]);
%!test
%! __fntestfunc__ ('permute', m3, [2, 1]);
%!test
%! __fntestfunc__ ('ipermute', m1, [2, 1]);
%!test
-%! __fntestfunc__ ('ipermute', m2, false, [3, 1, 2]);
+%! __fntestfunc__ ('ipermute', m2, {'sparse', 'logical sparse', 'complex
sparse'}, [3, 1, 2]);
%!test
%! __fntestfunc__ ('ipermute', m3, [2, 1]);
%!test
%! __fntestfunc__ ('shiftdim', m2, 1);
%!test
-%! __fntestfunc__ ('shiftdim', m2, false, -1);
+%! __fntestfunc__ ('shiftdim', m2, {'sparse', 'logical sparse', 'complex
sparse'}, -1);
%!test
%! __fntestfunc__ ('shiftdim', m3, 1);
%!test
@@ -136,19 +140,19 @@
%!test
%! __fntestfunc__ ('reshape', m3, [1, 0]);
%!test
-%! __fntestfunc__ ('diag', m0);
+%! __fntestfunc__ ('diag', m0, {'struct'});
%!test
-%! __fntestfunc__ ('diag', m0, 1);
+%! __fntestfunc__ ('diag', m0, {'struct'}, 1);
%!test
-%! __fntestfunc__ ('diag', m0, -1);
+%! __fntestfunc__ ('diag', m0, {'struct'}, -1);
%!test
-%! __fntestfunc__ ('diag', m1);
+%! __fntestfunc__ ('diag', m1, {'struct'});
%!test
-%! __fntestfunc__ ('diag', m1, 1);
+%! __fntestfunc__ ('diag', m1, {'struct'}, 1);
%!test
-%! __fntestfunc__ ('diag', m1, -1);
+%! __fntestfunc__ ('diag', m1, {'struct'}, -1);
%!test
-%! __fntestfunc__ ('diag', m3);
+%! __fntestfunc__ ('diag', m3, {'struct'});
%!test
%! __fntestfunc__ ('fliplr', m1);
%!test
- Re: goals for 3.1, David Bateman, 2008/03/09
- Re: goals for 3.1, John W. Eaton, 2008/03/12
- Re: goals for 3.1, David Bateman, 2008/03/20
- Re: goals for 3.1, David Bateman, 2008/03/20
- Re: goals for 3.1, John W. Eaton, 2008/03/20
- Re: goals for 3.1, David Bateman, 2008/03/20
- Re: goals for 3.1,
David Bateman <=
- Re: goals for 3.1, John W. Eaton, 2008/03/20
- Re: goals for 3.1, David Bateman, 2008/03/20
- Re: goals for 3.1, John W. Eaton, 2008/03/21