Incompatibility with matlab logical indexing

View: New views
3 Messages — Rating Filter:   Alert me  

Incompatibility with matlab logical indexing

by pbellec :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

--------
Bug report for Octave 2.9.9 configured for i486-pc-linux-gnu

Description:
-----------

On Matlab, A(b) is equivalent to A(find(b)) when b is logical.

This is the case in octave only if length(b(:))==length(A(:)).

Repeat-By:
---------

> a = [1 2; 3 4]

In matlab :

> a([1 1]==1)
ans =
     1    3

In octave :
>a([1 1]==1)
ans =
     1
     1

Fix:
---

One may of course replace all instances of A(b) where b is logical by A(find(b)), but this is a bit
annoying.

Configuration (please do not edit this section):
------------------------------
-----------------

uname output:     Linux rossinante 2.6.20-16-generic #2 SMP Tue Feb 12 05:41:34 UTC 2008 i686 GNU/Linux
configure opts:   '--prefix=/usr' '--datadir=/usr/share' '--libdir=/usr/lib' '--libexecdir=/usr/lib' '--infodir=/usr/share/info' '--mandir=/usr/share/man' '--with-blas=-lblas-3' '--with-lapack=-llapack-3' '--with-hdf5' '--with-fftw' '--with-f77=/usr/bin/gfortran' '--enable-shared' '--enable-rpath' '--disable-static' '--build' 'i486-linux-gnu' 'build_alias=i486-linux-gnu' 'CC=/usr/bin/gcc' 'CXX=/usr/bin/g++' 'F77=/usr/bin/gfortran'
Fortran compiler: /usr/bin/gfortran
FFLAGS:           -O2
F2C:             
F2CFLAGS:        
FLIBS:            -L/usr/lib/gcc/i486-linux-gnu/4.1.2 -L/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../lib -L/lib/../lib -L/usr/lib/../lib -lhdf5 -lz -lgfortranbegin -lgfortran -lm
CPPFLAGS:        
INCFLAGS:         -I. -I. -I./liboctave -I./src -I./libcruft/misc
C compiler:       /usr/bin/gcc, version 4.1.2 20061103 (prerelease) (Ubuntu 4.1.1-18ubuntu2)
CFLAGS:           -O2
CPICFLAG:         -fPIC
C++ compiler:     /usr/bin/g++, version 4.1.2
CXXFLAGS:         -O2
CXXPICFLAG:       -fPIC
LD_CXX:           /usr/bin/g++
LDFLAGS:          -s
LIBFLAGS:         -L.
RLD_FLAG:         -Wl,-rpath -Wl,/usr/lib/octave-2.9.9
BLAS_LIBS:        -llapack-3 -lblas-3
FFTW_LIBS:        -lfftw3
LIBS:             -lreadline  -lncurses -ldl -lhdf5 -lz -lm
LEXLIB:          
LIBDLFCN:        
LIBGLOB:         
SED:              /bin/sed
DEFS:

  -DPACKAGE_NAME="" -DPACKAGE_TARNAME="" -DPACKAGE_VERSION=""
  -DPACKAGE_STRING="" -DPACKAGE_BUGREPORT="" -DOCTAVE_SOURCE=1
  -D_GNU_SOURCE=1 -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1
  -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1
  -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DSEPCHAR=':'
  -DSEPCHAR_STR=":" -D__NO_MATH_INLINES=1 -DCXX_NEW_FRIEND_TEMPLATE_DECL=1
  -DCXX_ISO_COMPLIANT_LIBRARY=1 -DCXX_ABI=gnu_v3 -DHAVE_LIBM=1
  -DHAVE_PCRE=1 -DHAVE_REGEXEC=1 -DHAVE_REGEX=1 -DHAVE_ZLIB_H=1
  -DHAVE_ZLIB=1 -DHAVE_HDF5_H=1 -DHAVE_HDF5=1 -DHAVE_H5GGET_NUM_OBJS=1
  -DHAVE_FFTW3=1 -DHAVE_GLPK_H=1 -DHAVE_GLPK=1 -DHAVE_IEEE754_DATA_FORMAT=1
  -DF77_FUNC(name,NAME)=name ## _ -DF77_FUNC_(name,NAME)=name ##
  _ -DHAVE_BLAS=1 -DHAVE_UFSPARSE_UMFPACK_H=1 -DHAVE_UMFPACK=1
  -DUMFPACK_SEPARATE_SPLIT=1 -DHAVE_UFSPARSE_COLAMD_H=1
  -DHAVE_COLAMD=1 -DHAVE_UFSPARSE_CCOLAMD_H=1 -DHAVE_CCOLAMD=1
  -DHAVE_UFSPARSE_CHOLMOD_H=1 -DHAVE_CHOLMOD=1 -DHAVE_UFSPARSE_CS_H=1
  -DHAVE_CXSPARSE=1 -DHAVE_GETHOSTNAME=1 -DHAVE_GETPWNAM=1 -DHAVE_DEV_T=1
  -DHAVE_INO_T=1 -DHAVE_NLINK_T=1 -DHAVE_NLINK_T=1 -DHAVE_LONG_LONG_INT=1
  -DHAVE_UNSIGNED_LONG_LONG_INT=1 -DHAVE_SIGSET_T=1 -DHAVE_SIG_ATOMIC_T=1
  -DSIZEOF_SHORT=2 -DSIZEOF_INT=4 -DSIZEOF_LONG=4 -DSIZEOF_LONG_LONG=8
  -DHAVE_ALLOCA_H=1 -DHAVE_ALLOCA=1 -DNPOS=std::string::npos
  -DHAVE_PLACEMENT_DELETE=1 -DHAVE_DYNAMIC_AUTO_ARRAYS=1
  -DSTDC_HEADERS=1 -DHAVE_DIRENT_H=1 -DTIME_WITH_SYS_TIME=1
  -DHAVE_SYS_WAIT_H=1 -DHAVE_ASSERT_H=1 -DHAVE_CURSES_H=1 -DHAVE_DLFCN_H=1
  -DHAVE_FCNTL_H=1 -DHAVE_FLOAT_H=1 -DHAVE_GRP_H=1 -DHAVE_INTTYPES_H=1
  -DHAVE_LIMITS_H=1 -DHAVE_LOCALE_H=1 -DHAVE_MEMORY_H=1 -DHAVE_NCURSES_H=1
  -DHAVE_POLL_H=1 -DHAVE_PWD_H=1 -DHAVE_STDINT_H=1 -DHAVE_STDLIB_H=1
  -DHAVE_STRING_H=1 -DHAVE_SYS_IOCTL_H=1 -DHAVE_SYS_PARAM_H=1
  -DHAVE_SYS_POLL_H=1 -DHAVE_SYS_RESOURCE_H=1 -DHAVE_SYS_SELECT_H=1
  -DHAVE_SYS_STAT_H=1 -DHAVE_SYS_TIME_H=1 -DHAVE_SYS_TIMES_H=1
  -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_UTSNAME_H=1 -DHAVE_TERMCAP_H=1
  -DHAVE_UNISTD_H=1 -DHAVE_SSTREAM=1 -DHAVE_TERMIO_H=1 -DHAVE_SGTTY_H=1
  -DHAVE_GLOB_H=1 -DHAVE_FNMATCH_H=1 -DHAVE_FNMATCH=1 -DHAVE_GLOB=1
  -DHAVE_ATEXIT=1 -DHAVE_BASENAME=1 -DHAVE_BCOPY=1 -DHAVE_BZERO=1
  -DHAVE_CANONICALIZE_FILE_NAME=1 -DHAVE_DUP2=1 -DHAVE_ENDGRENT=1
  -DHAVE_ENDPWENT=1 -DHAVE_EXECVP=1 -DHAVE_FCNTL=1 -DHAVE_FORK=1
  -DHAVE_GETCWD=1 -DHAVE_GETEGID=1 -DHAVE_GETEUID=1 -DHAVE_GETGID=1
  -DHAVE_GETGRENT=1 -DHAVE_GETGRGID=1 -DHAVE_GETGRNAM=1 -DHAVE_GETPGRP=1
  -DHAVE_GETPID=1 -DHAVE_GETPPID=1 -DHAVE_GETPWENT=1 -DHAVE_GETPWUID=1
  -DHAVE_GETTIMEOFDAY=1 -DHAVE_GETUID=1 -DHAVE_GETWD=1 -DHAVE_KILL=1
  -DHAVE_LINK=1 -DHAVE_LOCALTIME_R=1 -DHAVE_LSTAT=1 -DHAVE_MEMMOVE=1
  -DHAVE_MKDIR=1 -DHAVE_MKFIFO=1 -DHAVE_MKSTEMP=1 -DHAVE_ON_EXIT=1
  -DHAVE_PIPE=1 -DHAVE_POLL=1 -DHAVE_PUTENV=1 -DHAVE_RAISE=1
  -DHAVE_READLINK=1 -DHAVE_RENAME=1 -DHAVE_RINDEX=1 -DHAVE_RMDIR=1
  -DHAVE_ROUND=1 -DHAVE_SELECT=1 -DHAVE_SETGRENT=1 -DHAVE_SETLOCALE=1
  -DHAVE_SETPWENT=1 -DHAVE_SETVBUF=1 -DHAVE_SIGACTION=1 -DHAVE_SIGLONGJMP=1
  -DHAVE_SIGPENDING=1 -DHAVE_SIGPROCMASK=1 -DHAVE_SIGSUSPEND=1 -DHAVE_STAT=1
  -DHAVE_STRCASECMP=1 -DHAVE_STRDUP=1 -DHAVE_STRERROR=1 -DHAVE_STRFTIME=1
  -DHAVE_STRNCASECMP=1 -DHAVE_STRPTIME=1 -DHAVE_STRSIGNAL=1
  -DHAVE_SYMLINK=1 -DHAVE_TEMPNAM=1 -DHAVE_UMASK=1 -DHAVE_UNAME=1
  -DHAVE_UNLINK=1 -DHAVE_USLEEP=1 -DHAVE_VFPRINTF=1 -DHAVE_VSPRINTF=1
  -DHAVE_VSNPRINTF=1 -DHAVE_WAITPID=1 -DHAVE_LIBDL=1 -DHAVE_DLOPEN=1
  -DHAVE_DLSYM=1 -DHAVE_DLERROR=1 -DHAVE_DLCLOSE=1 -DHAVE_DLOPEN_API=1
  -DENABLE_DYNAMIC_LINKING=1 -DHAVE_TIMEVAL=1 -DHAVE_FINITE=1
  -DHAVE_ISNAN=1 -DHAVE_ISINF=1 -DHAVE_COPYSIGN=1 -DHAVE_DECL_SIGNBIT=1
  -DHAVE_ACOSH=1 -DHAVE_ASINH=1 -DHAVE_ATANH=1 -DHAVE_ERF=1 -DHAVE_ERFC=1
  -DHAVE_EXP2=1 -DHAVE_LOG2=1 -DHAVE_STRUCT_STAT_ST_BLKSIZE=1
  -DHAVE_STRUCT_STAT_ST_BLOCKS=1 -DHAVE_STRUCT_STAT_ST_RDEV=1
  -DHAVE_STRUCT_TM_TM_ZONE=1 -DHAVE_TM_ZONE=1 -DUSE_READLINE=1
  -DEXCEPTION_IN_MATH=1 -DRETSIGTYPE=void -DHAVE_DECL_SYS_SIGLIST=1
  -DHAVE_POSIX_SIGNALS=1 -DHAVE_GETRUSAGE=1 -DHAVE_TIMES=1
  -DYYTEXT_POINTER=1 -DGNUPLOT_BINARY="gnuplot" -DGNUPLOT_HAS_FRAMES=

User-preferences (please do not edit this section):
--------------------------------------------------

  EDITOR = emacs
  EXEC_PATH = /usr/lib/octave/2.9.9/site/exec/i486-pc-linux-gnu:/usr/lib/octave/api-v22/site/exec/i486-pc-linux-gnu:/usr/lib/octave/site/exec/i486-pc-linux-gnu:/usr/lib/octave/2.9.9/exec/i486-pc-linux-gnu:/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/bic/bin
  IMAGE_PATH = .:/usr/share/octave/2.9.9/imagelib
  PAGER = pager
  PS1 = \s:\#>
  PS2 = >
  PS4 = +
  automatic_replot = 1
  beep_on_error = 0
  completion_append_char = 
  crash_dumps_octave_core = 1
  echo_executing_commands = 0
  fixed_point_format = 0
  gnuplot_binary = gnuplot
  gnuplot_command_end =

  gnuplot_command_plot = pl
  gnuplot_command_replot = rep
  gnuplot_command_splot = sp
  gnuplot_command_title = t
  gnuplot_command_using = u
  gnuplot_command_with = w
  history_file = /home/pbellec/.octave_hist
  history_size = 1024
  ignore_function_time_stamp = system
  info_file = /usr/share/info/octave2.9.info
  info_program = info
  makeinfo_program = makeinfo
  max_recursion_depth = 256
  output_max_field_width = 5
  output_precision = 5
  page_output_immediately = 0
  page_screen_output = 1
  print_answer_id_name = 1
  print_empty_dimensions = 1
  save_precision = 16
  saving_history = 1
  sighup_dumps_octave_core = 1
  sigterm_dumps_octave_core = 1
  silent_functions = 0
  split_long_rows = 1
  string_fill_char = 
  struct_levels_to_print = 2
  suppress_verbose_help_message = 0

_______________________________________________
Bug-octave mailing list
Bug-octave@...
https://www.cae.wisc.edu/mailman/listinfo/bug-octave

Incompatibility with matlab logical indexing

by John W. Eaton :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

On  7-Mar-2008, Pierre Bellec wrote:

| --------
| Bug report for Octave 2.9.9 configured for i486-pc-linux-gnu
|
| Description:
| -----------
|
| On Matlab, A(b) is equivalent to A(find(b)) when b is logical.
|
| This is the case in octave only if length(b(:))==length(A(:)).

I seem to recall that this used to be the case for Matlab as well, but
I can no longer be sure about that.  In any case, thanks for pointing
this out as thinking of it this way is simpler and I think avoids the
need for some special cases that we had in the indexing code.

This is also true when you have something like A(b,c) or A(b,:) when b
and c are logical, correct?

| Repeat-By:
| ---------
|
| > a = [1 2; 3 4]
|
| In matlab :
|
| > a([1 1]==1)
| ans =
|      1    3
|
| In octave :
| >a([1 1]==1)
| ans =
|      1
|      1

Please try the following patch.  It's relative to the current 3.0.x
branch in the mercurial archive.  I don't know whether it will apply
to 2.9.9, but then that is obsolete now that 3.0.0 is available, so
I'd recommend upgrading.  I've also checked in a similar patch for the
current development sources.  There is some cleanup left to do, but I
left that out of this patch so that it would not be cluttered with
extraneous changes that really don't affect how things work.

| One may of course replace all instances of A(b) where b is logical by
| A(find(b)), but this is a bit
| annoying.

Was it really necessary to add that?  I mean, I'd guess that Octave is
a pretty sweet deal for most people, yet you go out of your way to
tell us that having to change your code to work around a bug would be
annoying, while at the same time you are apparently expecting someone
else to do some work to fix the problem so you can avoid the (did I
mention annoying) effort of fixing your code?

Oh, and what Clint said: http://math-atlas.sourceforge.net/faq.html#utone

jwe



# HG changeset patch
# User John W. Eaton <jwe@...>
# Date 1204939308 18000
# Branch release-3-0-x
# Node ID 5cd053b8d9cd93b773f8cf5d2e546fd55fba6a49
# Parent  2f3abc5ee6e8d6cef655c2529ccabdf95825e776
logical indexing compatibility fixes

diff --git a/liboctave/ChangeLog b/liboctave/ChangeLog
--- a/liboctave/ChangeLog
+++ b/liboctave/ChangeLog
@@ -1,3 +1,11 @@ 2008-03-03  David Bateman  <dbateman@fre
+2008-03-07  John W. Eaton  <jwe@...>
+
+ * idx-vector.cc (IDX_VEC_REP::idx_vector_rep (bool),
+ IDX_VEC_REP::idx_vector_rep (const boolNDArray&)):
+ Simply perform the equivalent of "find" on the bool argument here,
+ set one_zero to 0 and orig_dims to size of resulting index vector.
+ (IDX_VEC_REP::freeze): Don't call maybe_convert_one_zero_to_idx here.
+
 2008-03-03  David Bateman  <dbateman@...>
 
  * Sparse.cc (assign1, assign1): Take care of repeated index
diff --git a/liboctave/idx-vector.cc b/liboctave/idx-vector.cc
--- a/liboctave/idx-vector.cc
+++ b/liboctave/idx-vector.cc
@@ -273,41 +273,51 @@ IDX_VEC_REP::idx_vector_rep (char c)
 }
 
 IDX_VEC_REP::idx_vector_rep (bool b)
-  : data (0), len (1), num_zeros (0), num_ones (0),
+  : data (0), len (b ? 1 : 0), num_zeros (0), num_ones (0),
     max_val (0), min_val (0), count (1), frozen_at_z_len (0),
-    frozen_len (0), colon (0), one_zero (1), initialized (0),
+    frozen_len (0), colon (0), one_zero (0), initialized (0),
     frozen (0), colon_equiv_checked (0), colon_equiv (0),
-    orig_dims (1, 1)
+    orig_dims (len, len)
 {
-  data = new octave_idx_type [len];
-
-  data[0] = tree_to_mat_idx (b);
-
-  init_state ();
+  if (len == 0)
+    initialized = 1;
+  else
+    {
+      data = new octave_idx_type [len];
+      data[0] = 0;
+      init_state ();
+    }
 }
 
 IDX_VEC_REP::idx_vector_rep (const boolNDArray& bnda)
-  : data (0), len (bnda.length ()), num_zeros (0), num_ones (0),
+  : data (0), len (bnda.nnz ()), num_zeros (0), num_ones (0),
     max_val (0), min_val (0), count (1), frozen_at_z_len (0),
-    frozen_len (0), colon (0), one_zero (1), initialized (0),
+    frozen_len (0), colon (0), one_zero (0), initialized (0),
     frozen (0), colon_equiv_checked (0), colon_equiv (0),
-    orig_dims (bnda.dims ())
+    orig_dims ()
 {
   if (len == 0)
     {
+      orig_dims = dim_vector (0, 0);
       initialized = 1;
-      return;
     }
   else
     {
-      octave_idx_type k = 0;
       data = new octave_idx_type [len];
 
-      for (octave_idx_type i = 0; i < len; i++)
- data[k++] = tree_to_mat_idx (bnda.elem (i));
+      octave_idx_type ntot = bnda.length ();
+
+      for (octave_idx_type i = 0, k = 0; i < ntot; i++, k < len)
+ if (bnda.elem (i))
+  data[k++] = i;
+
+      dim_vector dv = bnda.dims ();
+
+      orig_dims = ((dv.length () == 2 && dv(0) == 1)
+   ? dim_vector (1, len) : orig_dims = dim_vector (len, 1));
+
+      init_state ();
     }
-
-  init_state ();
 }
 
 IDX_VEC_REP&
@@ -569,8 +579,6 @@ IDX_VEC_REP::freeze (octave_idx_type z_l
  frozen_len = 0;
       else
  {
-  maybe_convert_one_zero_to_idx (z_len);
-
   max_val = max ();
   min_val = min ();
 
diff --git a/test/ChangeLog b/test/ChangeLog
--- a/test/ChangeLog
+++ b/test/ChangeLog
@@ -1,3 +1,8 @@ 2008-03-06  John W. Eaton  <jwe@...
+2008-03-07  John W. Eaton  <jwe@...>
+
+ * test_logical-wfi-t.m, test_logical-wfi-f.m: Update tests for
+ logical indexing bug fix.
+
 2008-03-06  John W. Eaton  <jwe@...>
 
  * test_string.m: Delete obsolete test for deblank.
diff --git a/test/test_logical-wfi-f.m b/test/test_logical-wfi-f.m
--- a/test/test_logical-wfi-f.m
+++ b/test/test_logical-wfi-f.m
@@ -46,8 +46,9 @@
 %!test
 %! wfi = warning ("query", "Octave:fortran-indexing");
 %! warning ("off", "Octave:fortran-indexing");
-%! a = 2;
-%! assert(all (a(logical ([1,1])) == [2,2]));
+%!shared a
+%!  a = 2;
+%!error <invalid vector index> a(logical ([1,1]));
 %! warning ("wfi.state", "Octave:fortran-indexing");
 
 %% test/octave.test/logical-wfi-f/v-1.m
@@ -79,7 +80,7 @@
 %! wfi = warning ("query", "Octave:fortran-indexing");
 %! warning ("off", "Octave:fortran-indexing");
 %! a = [9,8,7,6];
-%! assert(all (a(logical ([1,1])) == [9,9]));
+%! assert(all (a(logical ([1,1])) == [9,8]));
 %! warning ("wfi.state", "Octave:fortran-indexing");
 
 %% test/octave.test/logical-wfi-f/m-1.m
@@ -95,7 +96,7 @@
 %! wfi = warning ("query", "Octave:fortran-indexing");
 %! warning ("off", "Octave:fortran-indexing");
 %! a = [9,8;7,6];
-%! assert(all (a(logical ([1,1,1,1])) == [9;7;8;6]));
+%! assert(all (a(logical ([1,1,1,1])) == [9,7,8,6]));
 %! warning ("wfi.state", "Octave:fortran-indexing");
 
 %% test/octave.test/logical-wfi-f/m-3.m
@@ -103,7 +104,7 @@
 %! wfi = warning ("query", "Octave:fortran-indexing");
 %! warning ("off", "Octave:fortran-indexing");
 %! a = [9,8;7,6];
-%! assert(all (a(logical ([0,1,1,0])) == [7;8]));
+%! assert(all (a(logical ([0,1,1,0])) == [7,8]));
 %! warning ("wfi.state", "Octave:fortran-indexing");
 
 %% test/octave.test/logical-wfi-f/m-4.m
diff --git a/test/test_logical-wfi-t.m b/test/test_logical-wfi-t.m
--- a/test/test_logical-wfi-t.m
+++ b/test/test_logical-wfi-t.m
@@ -46,8 +46,9 @@
 %!test
 %! wfi = warning ("query", "Octave:fortran-indexing");
 %! warning ("on", "Octave:fortran-indexing");
+%!shared a
 %! a = 2;
-%! assert(all (a(logical ([1,1])) == [2,2]));
+%!error <invalid vector index.*> a(logical ([1,1]));
 %! warning ("wfi.state", "Octave:fortran-indexing");
 
 %% test/octave.test/logical-wfi-t/v-1.m
@@ -79,7 +80,7 @@
 %! wfi = warning ("query", "Octave:fortran-indexing");
 %! warning ("on", "Octave:fortran-indexing");
 %! a = [9,8,7,6];
-%! assert(all (a(logical ([1,1])) == [9,9]));
+%! assert(all (a(logical ([1,1])) == [9,8]));
 %! warning ("wfi.state", "Octave:fortran-indexing");
 
 %% test/octave.test/logical-wfi-t/m-1.m
@@ -95,7 +96,7 @@
 %! wfi = warning ("query", "Octave:fortran-indexing");
 %! warning ("on", "Octave:fortran-indexing");
 %! a = [9,8;7,6];
-%! all (a(logical ([1,1,1,1])) == [9;7;8;6]);
+%! all (a(logical ([1,1,1,1])) == [9,7,8,6]);
 %! warning ("wfi.state", "Octave:fortran-indexing");
 
 %% test/octave.test/logical-wfi-t/m-3.m
@@ -103,7 +104,7 @@
 %! wfi = warning ("query", "Octave:fortran-indexing");
 %! warning ("on", "Octave:fortran-indexing");
 %! a = [9,8;7,6];
-%! all (a(logical ([0,1,1,0])) == [7;8]);
+%! all (a(logical ([0,1,1,0])) == [7,8]);
 %! warning ("wfi.state", "Octave:fortran-indexing");
 
 %% test/octave.test/logical-wfi-t/m-4.m

_______________________________________________
Bug-octave mailing list
Bug-octave@...
https://www.cae.wisc.edu/mailman/listinfo/bug-octave

Re: Incompatibility with matlab logical indexing

by pbellec :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message


On  7-Mar-2008, Pierre Bellec wrote:

| --------
| Bug report for Octave 2.9.9 configured for i486-pc-linux-gnu
|
| Description:
| -----------
|
| On Matlab, A(b) is equivalent to A(find(b)) when b is logical.
|
| This is the case in octave only if length(b(:))==length(A(:)).

I seem to recall that this used to be the case for Matlab as well, but
I can no longer be sure about that.  In any case, thanks for pointing
this out as thinking of it this way is simpler and I think avoids the
need for some special cases that we had in the indexing code.

This is also true when you have something like A(b,c) or A(b,:) when b
and c are logical, correct?

<\quote>

That's correct :

> a = [1 2 3; 4 5 6];

In Matlab 7.0.1 and Octave 2.9.9 we have

>a(:,[1 1])
ans =
            1     1
            4     4
The first column is repeated twice...
Now with logical index, matlab 7.0.1 produces :
> a(:,[1 1]==1)

ans =

     1     2
     4     5
While Octave 2.9.9 produces :
> a(:,[1 1]==1)
ans =

   1   1
   4   4

I'm going to test the patch ! Thanks a lot for the tremendously fast fix !


On  7-Mar-2008, Pierre Bellec wrote:
| One may of course replace all instances of A(b) where b is logical by
| A(find(b)), but this is a bit
| annoying.
Was it really necessary to add that?  I mean, I'd guess that Octave is
a pretty sweet deal for most people, yet you go out of your way to
tell us that having to change your code to work around a bug would be
annoying, while at the same time you are apparently expecting someone
else to do some work to fix the problem so you can avoid the (did I
mention annoying) effort of fixing your code?
<\quote>

Sorry about the misunderstanding. That's my first contribution to this list, and I was not sure what the "suggested fix" was meant for. My suggestion was aimed at common users. The "it is a bit annoying" part was just here to indicate that the workaround was not fully satisfactory compared to an actual patch, that I was not expecting to come so fast. It was by no mean a complaint ! Just to let you know, I have started to port the medical imaging library me and colleagues have developed over the past few years from Matlab to the open source world. This is running very smoothly so far thanks to Octave and I am extremely grateful to the people who developed such a great piece of software.