From bug-octave-request at che dot utexas dot edu Tue May 17 16:48:58 1994 Subject: Re: Matrix with negative # of column or row From: John Eaton To: "G.Beyerle" cc: bug-octave at che dot utexas dot edu Date: Tue, 17 May 94 16:48:47 EDT "G.Beyerle" wrote: : the following (admittedly non-sense) statements lead to : matrices with negative number of rows or columns. : : octave:1> x=[1 2 3] : octave:2> x([2 2 2 2 2])=[] : octave:3> size(x) : ans = : : 1 -2 : : And furthermore: : : octave:1> x=[1 2 3] : octave:2> x([2*ones(1,1000)])=[] : error: caught SIGSEGV -- stopping myself... : Segmentation fault Here's a patch that should fix these problems. Thanks, jwe --- src/tc-assign.cc.orig 1994/04/09 23:01:28 +++ src/tc-assign.cc 1994/05/17 20:14:06 at @ -1853,7 +1853,7 @@ void tree_constant_rep::delete_rows (idx_vector& iv) { - iv.sort (); + iv.sort_uniq (); int num_to_delete = iv.length (); if (type_tag == matrix_constant) at @ -2023,7 +2023,7 @@ void tree_constant_rep::delete_columns (idx_vector& jv) { - jv.sort (); + jv.sort_uniq (); int num_to_delete = jv.length (); if (type_tag == matrix_constant) --- src/idx-vector.h.orig 1994/03/09 21:19:44 +++ src/idx-vector.h 1994/05/17 20:14:35 at @ -62,6 +62,7 @@ int ones_count (void) const; void sort (void); + void sort_uniq (void); // i/o --- src/idx-vector.cc.orig 1993/11/30 20:24:36 +++ src/idx-vector.cc 1994/05/17 21:39:16 at @ -1,7 +1,7 @@ // Very simple integer vectors for indexing -*- C++ -*- /* -Copyright (C) 1992, 1993 John W. Eaton +Copyright (C) 1992, 1993, 1994 John W. Eaton This file is part of Octave. at @ -287,6 +287,30 @@ { qsort ((void *) data, len, sizeof (int), (int (*)(void*, void*)) intcmp); +} + +void +idx_vector::sort_uniq (void) +{ + if (len > 0) + { + sort (); + + int *new_data = new int [len]; + new_data[0] = data[0]; + int k = 0; + for (int i = 1; i < len; i++) + { + if (data[i] != new_data[k]) + { + k++; + new_data[k] = data[i]; + } + } + delete [] data; + len = k+1; + data = new_data; + } } ostream&