view extra/patches/M-v-ops-2.1.31.patch @ 0:6b33357c7561 octave-forge

Initial revision
author pkienzle
date Wed, 10 Oct 2001 19:54:49 +0000
parents
children
line wrap: on
line source

From pkienzle@kienzle.powernet.co.uk Thu Oct 05 11:27:38 2000
Envelope-to: pkienzle@kienzle.powernet.co.uk
Received: from pkienzle by kienzle with local (Exim 3.12 #1 (Debian))
	id 13h8FW-0004mU-00; Thu, 05 Oct 2000 11:27:38 +0100
To: bug-octave@bevo.che.wisc.edu, pkienzle@kienzle.powernet.co.uk
Subject:  M-v ops
Message-Id: <E13h8FW-0004mU-00@kienzle>
From: Paul Kienzle <pkienzle@kienzle.powernet.co.uk>
Date: Thu, 05 Oct 2000 11:27:38 +0100
Status: RO
Content-Length: 12828
Lines: 351

To: bug-octave@bevo.che.wisc.edu
Cc: pkienzle
Subject: M-v ops

Bug report for Octave 2.1.31 configured for %OCTAVE_CANONICAL_HOST_TYPE%

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

Octave's element-wise binary operations .*,./,.\,+,- can be extended
to handle the case where one of the operands is a row or column vector
with the same length as the corresponding dimension of the matrix M.
The vector operation is simply repeated as many times as necessary to
match the dimensions of M.

The same extension should be done for .^ (in src/xpow.cc) and for the 
boolean and comparison operators (in mx-op-defs.h).  

The same concept applies for N-dimensional matrices, with the lengths
of each dimension of v either being 1 or matching the length of the
corresponding dimension of M.

The concept could be extended to compute outer products as well, if
you allow M to have dimensions of length 1 while the corresponding
dimension of v has dimension greater than 1.  I don't know if you
would want to though.  The convenience of generating outer products
needs to be weighed against the convenience of debugging errors in
the shape of your vectors (e.g., when you are applying a window to
your data, you don't want to accidentally create 1024x1024 arrays).

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

octave:6> rand(3).*[1:3]  
error: product: nonconformant arguments (op1 is 3x3, op2 is 1x3)
error: evaluating assignment expression near line 6, column 8

Fix:
---

*** MArray2.cc	2000/10/05 09:33:32	1.1
--- MArray2.cc	2000/10/04 08:47:13
***************
*** 149,158 ****
      int b_nr = b.rows (); \
      int b_nc = b.cols (); \
      if (a_nr != b_nr || a_nc != b_nc) \
!       { \
!         gripe_nonconformant (#FCN, a_nr, a_nc, b_nr, b_nc); \
! 	return MArray2<T> (); \
!       } \
      if (a_nr == 0 || a_nc == 0) \
        return MArray2<T> (a_nr, a_nc); \
      int l = a.length (); \
--- 149,205 ----
      int b_nr = b.rows (); \
      int b_nc = b.cols (); \
      if (a_nr != b_nr || a_nc != b_nc) \
!       if (a_nr == b_nr && a_nc == 1) \
!         { \
! 	  MArray2<T> result (a_nr, b_nc); \
!           T *r = result.fortran_vec (); \
!           const T *x = a.data (); \
!           const T *y = b.data (); \
!           int k=0; \
! 	  for (int j=0; j < b_nc; j++) \
! 	    for (int i=0; i < a_nr; i++, k++) \
!                r[k] = x[i] OP y[k]; \
!           return result; \
!         } \
!       else if (a_nr == b_nr && b_nc == 1) \
!         { \
! 	  MArray2<T> result (a_nr, a_nc); \
!           T *r = result.fortran_vec (); \
!           const T *x = a.data (); \
!           const T *y = b.data (); \
!           int k=0; \
! 	  for (int j=0; j < a_nc; j++) \
! 	    for (int i=0; i < a_nr; i++, k++) \
!                r[k] = x[k] OP y[i]; \
!           return result; \
!         } \
!       else if (a_nc == b_nc && b_nr == 1) \
!         { \
! 	  MArray2<T> result (a_nr, a_nc); \
!           T *r = result.fortran_vec (); \
!           const T *x = a.data (); \
!           const T *y = b.data (); \
! 	  for (int i=0; i < a_nr; i++) \
! 	    for (int j=0, k=i; j < a_nc; j++, k+=a_nr) \
!                r[k] = x[k] OP y[j]; \
!           return result; \
!         } \
!       else if (a_nc == b_nc && a_nr == 1) \
!         { \
! 	  MArray2<T> result (b_nr, a_nc); \
!           T *r = result.fortran_vec (); \
!           const T *x = a.data (); \
!           const T *y = b.data (); \
! 	  for (int i=0; i < b_nr; i++) \
! 	    for (int j=0, k=i; j < a_nc; j++, k+=b_nr) \
!                r[k] = x[j] OP y[k]; \
!           return result; \
!         } \
!       else \
!         { \
!           gripe_nonconformant (#FCN, a_nr, a_nc, b_nr, b_nc); \
! 	  return MArray2<T> (); \
!         } \
      if (a_nr == 0 || a_nc == 0) \
        return MArray2<T> (a_nr, a_nc); \
      int l = a.length (); \
*** mx-op-defs.h	2000/10/05 09:33:32	1.1
--- mx-op-defs.h	2000/10/04 07:41:06
***************
*** 23,28 ****
--- 23,29 ----
  #if !defined (octave_mx_op_defs_h)
  #define octave_mx_op_defs_h 1
  
+ #include "lo-error.h"
  #include "mx-inlines.cc"
  
  #define BIN_OP_DECL(R, OP, X, Y) \
***************
*** 353,359 ****
    BIN_OP_DECL (R, product,    M1, M2); \
    BIN_OP_DECL (R, quotient,   M1, M2);
  
! #define MM_BIN_OP(R, OP, M1, M2, F) \
    R \
    OP (const M1& m1, const M2& m2) \
    { \
--- 354,360 ----
    BIN_OP_DECL (R, product,    M1, M2); \
    BIN_OP_DECL (R, quotient,   M1, M2);
  
! #define MM_BIN_OP(R, OP, M1, M2, F, OPSYM) \
    R \
    OP (const M1& m1, const M2& m2) \
    { \
***************
*** 366,372 ****
      int m2_nc = m2.cols (); \
   \
      if (m1_nr != m2_nr || m1_nc != m2_nc) \
!       gripe_nonconformant (#OP, m1_nr, m1_nc, m2_nr, m2_nc); \
      else \
        { \
  	r.resize (m1_nr, m1_nc); \
--- 367,402 ----
      int m2_nc = m2.cols (); \
   \
      if (m1_nr != m2_nr || m1_nc != m2_nc) \
!       if (m1_nr == m2_nr && m1_nc == 1) \
!         { \
! 	  r.resize (m1_nr, m2_nc); \
! 	  for (int j = 0; j < m2_nc; j++) \
! 	    for (int i = 0; i < m1_nr; i++) \
! 	      r.elem(i, j) = m1.elem(i, 0) OPSYM m2.elem(i, j); \
!         } \
!       else if (m1_nr == m2_nr && m2_nc == 1) \
!         { \
! 	  r.resize (m1_nr, m1_nc); \
! 	  for (int j = 0; j < m1_nc; j++) \
! 	    for (int i = 0; i < m1_nr; i++) \
! 	      r.elem(i, j) = m1.elem(i, j) OPSYM m2.elem(i, 0); \
!         } \
!       else if (m1_nc == m2_nc && m2_nr == 1) \
!         { \
! 	  r.resize (m1_nr, m1_nc); \
! 	  for (int j = 0; j < m1_nc; j++) \
! 	    for (int i = 0; i < m1_nr; i++) \
! 	      r.elem(i, j) = m1.elem(i, j) OPSYM m2.elem(0, j); \
!         } \
!       else if (m1_nc == m2_nc && m1_nr == 1) \
!         { \
! 	  r.resize (m2_nr, m1_nc); \
! 	  for (int j = 0; j < m1_nc; j++) \
! 	    for (int i = 0; i < m2_nr; i++) \
! 	      r.elem(i, j) = m1.elem(0, j) OPSYM m2.elem(i, j); \
!         } \
!       else \
! 	gripe_nonconformant (#OP, m1_nr, m1_nc, m2_nr, m2_nc); \
      else \
        { \
  	r.resize (m1_nr, m1_nc); \
***************
*** 379,388 ****
    }
  
  #define MM_BIN_OPS(R, M1, M2) \
!   MM_BIN_OP (R, operator +, M1, M2, add) \
!   MM_BIN_OP (R, operator -, M1, M2, subtract) \
!   MM_BIN_OP (R, product,    M1, M2, multiply) \
!   MM_BIN_OP (R, quotient,   M1, M2, divide)
  
  #define MM_CMP_OP_DECLS(M1, M2) \
    CMP_OP_DECL (mx_el_lt, M1, M2); \
--- 409,418 ----
    }
  
  #define MM_BIN_OPS(R, M1, M2) \
!   MM_BIN_OP (R, operator +, M1, M2, add, +) \
!   MM_BIN_OP (R, operator -, M1, M2, subtract, -) \
!   MM_BIN_OP (R, product,    M1, M2, multiply, *) \
!   MM_BIN_OP (R, quotient,   M1, M2, divide, /)
  
  #define MM_CMP_OP_DECLS(M1, M2) \
    CMP_OP_DECL (mx_el_lt, M1, M2); \



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

uname output:     Linux kienzle 2.2.17 #1 Sun Sep 10 17:51:52 BST 2000 i586 unknown
configure opts:   --prefix=/usr --datadir=/usr/share --libdir=/usr/lib --libexecdir=/usr/lib --infodir=/usr/share/info --mandir=/usr/share/man --with-g77 --with-fastblas --enable-dl --enable-shared --enable-lite-kernel --disable-static --host i386-linux
Fortran compiler: g77
FFLAGS:           -O2
F2C:              
F2CFLAGS:         
FLIBS:            -lg2c -lm -L/usr/lib/gcc-lib/i386-linux/2.95.2 -lm
CPPFLAGS:         
INCFLAGS:         -I. -I. -I./liboctave -I./src -I./libcruft/misc  -I./glob -I./glob
C compiler:       gcc, version 2.95.2 20000220 (Debian GNU/Linux)
CFLAGS:           -O2
CPICFLAG:         -fPIC
C++ compiler:     c++, version 2.95.2 20000220 (Debian GNU/Linux)
CXXFLAGS:         -O2
CXXPICFLAG:       -fPIC
LDFLAGS:          -s
LIBFLAGS:         -L.
RLD_FLAG:         -Xlinker -rpath -Xlinker /usr/lib/octave-2.1.31
TERMLIBS:         -lncurses
LIBS:             
LEXLIB:           
LIBPLPLOT:        
LIBDLFCN:         
LIBGLOB:          ./glob/glob.o ./glob/fnmatch.o
DEFS:

  -DOCTAVE_SOURCE=1 -DSEPCHAR=':' -DSEPCHAR_STR=":" -DUSE_READLINE=1
  -D__NO_MATH_INLINES=1 -DCXX_NEW_FRIEND_TEMPLATE_DECL=1 -DHAVE_LIBM=1
  -DHAVE_LIBZ=1 -DF77_APPEND_UNDERSCORE=1 -DOCTAVE_LITE=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 -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_FNMATCH_H=1 -DHAVE_GLOB_H=1 -DHAVE_GRP_H=1
  -DHAVE_LIMITS_H=1 -DHAVE_MEMORY_H=1 -DHAVE_NCURSES_H=1 -DHAVE_POLL_H=1
  -DHAVE_PWD_H=1 -DHAVE_SGTTY_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_TERMIO_H=1
  -DHAVE_UNISTD_H=1 -DHAVE_VARARGS_H=1 -DHAVE_ATEXIT=1 -DHAVE_BCOPY=1
  -DHAVE_BZERO=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_GETHOSTNAME=1 -DHAVE_GETPGRP=1
  -DHAVE_GETPID=1 -DHAVE_GETPPID=1 -DHAVE_GETPWENT=1 -DHAVE_GETPWNAM=1
  -DHAVE_GETPWUID=1 -DHAVE_GETTIMEOFDAY=1 -DHAVE_GETUID=1 -DHAVE_GETWD=1
  -DHAVE_LOCALTIME_R=1 -DHAVE_LSTAT=1 -DHAVE_MEMMOVE=1 -DHAVE_MKDIR=1
  -DHAVE_MKFIFO=1 -DHAVE_ON_EXIT=1 -DHAVE_PIPE=1 -DHAVE_POLL=1
  -DHAVE_PUTENV=1 -DHAVE_RENAME=1 -DHAVE_RINDEX=1 -DHAVE_RMDIR=1
  -DHAVE_SELECT=1 -DHAVE_SETGRENT=1 -DHAVE_SETPWENT=1 -DHAVE_SETVBUF=1
  -DHAVE_SIGACTION=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_TEMPNAM=1 -DHAVE_UMASK=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 -DWITH_DL=1 -DWITH_DYNAMIC_LINKING=1
  -DHAVE_TIMEVAL=1 -DHAVE_FINITE=1 -DHAVE_ISNAN=1 -DHAVE_ISINF=1
  -DHAVE_ACOSH=1 -DHAVE_ASINH=1 -DHAVE_ATANH=1 -DHAVE_ERF=1 -DHAVE_ERFC=1
  -DHAVE_ST_BLKSIZE=1 -DHAVE_ST_BLOCKS=1 -DHAVE_ST_RDEV=1 -DHAVE_TM_ZONE=1
  -DHAVE_GR_PASSWD=1 -DEXCEPTION_IN_MATH=1 -DRETSIGTYPE=void
  -DSYS_SIGLIST_DECLARED=1 -DHAVE_SYS_SIGLIST=1 -DHAVE_POSIX_SIGNALS=1
  -DHAVE_GETRUSAGE=1 -DHAVE_TIMES=1 -DGNUPLOT_HAS_MULTIPLOT=1
  -DGNUPLOT_HAS_FRAMES=1

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

  EDITOR = "vi"
  EXEC_PATH = "/home/pkienzle/octave/audio::/scratch/programs/audio/package/pipewave.1.3/bin:/scratch/programs/audio/pitch/POWERpv1.1G/bin:/home/pkienzle/pantome/bin:/home/pkienzle/sfs/bin:/home/pkienzle/bin:/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/usr/games"
  IMAGEPATH = ".:/usr/local/share/octave/2.1.31/imagelib//"
  INFO_FILE = "/usr/local/info/octave.info"
  INFO_PROGRAM = "info"
  LOADPATH = "/home/pkienzle/matcompat//:/home/pkienzle/octave//::/usr/lib/octave/2.1.31/oct/:/usr/share/octave/2.1.31//"
  PAGER = "less"
  PS1 = "\\s:\\#> "
  PS2 = "> "
  PS4 = "+ "
  automatic_replot = 0
  beep_on_error = 0
  completion_append_char = " "
  default_eval_print_flag = 1
# default_global_variable_value = <no value or error in displaying it>
  default_return_value = []
  default_save_format = "ascii"
  define_all_return_values = 0
  do_fortran_indexing = 0
  echo_executing_commands = 0
  empty_list_elements_ok = "warn"
  fixed_point_format = 0
  gnuplot_binary = "gnuplot"
  gnuplot_command_end = "\n"
  gnuplot_command_plot = "pl"
  gnuplot_command_replot = "rep"
  gnuplot_command_splot = "sp"
  gnuplot_command_title = "t"
  gnuplot_command_using = "u"
  gnuplot_command_with = "w"
  gnuplot_has_frames = 1
  gnuplot_has_multiplot = 1
  history_file = "/home/pkienzle/.octave_hist"
  history_size = 1024
  ignore_function_time_stamp = "system"
  implicit_num_to_str_ok = 0
  implicit_str_to_num_ok = 0
  initialize_global_variables = 0
  max_recursion_depth = 256
  ok_to_lose_imaginary_part = "warn"
  output_max_field_width = 10
  output_precision = 5
  page_output_immediately = 0
  page_screen_output = 1
  prefer_column_vectors = 1
  print_answer_id_name = 1
  print_empty_dimensions = 1
  print_rhs_assign_val = 0
  propagate_empty_matrices = 1
  resize_on_range_error = 1
  return_last_computed_value = 0
  save_precision = 15
  saving_history = 1
  silent_functions = 0
  split_long_rows = 1
  string_fill_char = " "
  struct_levels_to_print = 2
  suppress_verbose_help_message = 1
  treat_neg_dim_as_zero = 0
  warn_assign_as_truth_value = 1
  warn_divide_by_zero = 1
  warn_function_name_clash = 1
  warn_future_time_stamp = 1
  warn_missing_semicolon = 0
  warn_variable_switch_label = 0
  whitespace_in_literal_matrix =