[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: atan2 on 3 dimentional array
From: |
John W. Eaton |
Subject: |
Re: atan2 on 3 dimentional array |
Date: |
Tue, 15 Jul 2008 16:58:32 -0400 |
On 15-Jul-2008, dbateman wrote:
| kruvalig wrote:
| >
| > Is it normal, that i get error on
| >
| > octave.exe:7> atan2(rand(5,5,5),rand(5,5,5))
| > error: invalid conversion of NDArray to Matrix
| >
|
| I believe the changeset
|
| http://velveeta.che.wisc.edu/cgi-bin/hgwebdir.cgi/octave/rev/798b0a00e80c
|
| fixed this issue, dated 20 Feb 2008 fixed this. However, it hasn't been
| applied to the 3.0.x branch and arguably should have been. Though it might
| be considered a new feature that this works for NDArrays, so maybe not.
OK, I applied it. I'm attaching the updated patch for the
release-3-0-x branch.
BTW, we could really use a release manager for the stable branch.
Would anyone like to contribute by doing that?
Thanks,
jwe
# HG changeset patch
# User John W. Eaton <address@hidden>
# Date 1203547151 18000
# Branch release-3-0-x
# Node ID abbece6ab1864b1f4ea04d22de297e6e66bbd045
# Parent cd8576fabf72aec99fb1170cd5dce78a93d9fb90
atan2, fmod: accept N-d arrays
diff --git a/src/ChangeLog b/src/ChangeLog
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,8 @@
+2008-07-15 John W. Eaton <address@hidden>
+
+ * data.cc (map_d_m, map_m_d, map_m_m, Fatan2, Ffmod):
+ Handle N-d arrays.
+
2008-06-25 David Bateman <address@hidden>
* pr-output.cc (Frats): Print usage if nargin == 0.
diff --git a/src/data.cc b/src/data.cc
--- a/src/data.cc
+++ b/src/data.cc
@@ -130,61 +130,62 @@
typedef double (*d_dd_fcn) (double, double);
-static Matrix
-map_d_m (d_dd_fcn f, double x, const Matrix& y)
+static NDArray
+map_d_m (d_dd_fcn f, double x, const NDArray& y)
{
- octave_idx_type nr = y.rows ();
- octave_idx_type nc = y.columns ();
+ NDArray retval (y.dims ());
+ double *r_data = retval.fortran_vec ();
- Matrix retval (nr, nc);
+ const double *y_data = y.data ();
- for (octave_idx_type j = 0; j < nc; j++)
- for (octave_idx_type i = 0; i < nr; i++)
- {
- OCTAVE_QUIT;
- retval (i, j) = f (x, y (i, j));
- }
+ octave_idx_type nel = y.numel ();
+
+ for (octave_idx_type i = 0; i < nel; i++)
+ {
+ OCTAVE_QUIT;
+ r_data[i] = f (x, y_data[i]);
+ }
return retval;
}
-static Matrix
-map_m_d (d_dd_fcn f, const Matrix& x, double y)
+static NDArray
+map_m_d (d_dd_fcn f, const NDArray& x, double y)
{
- octave_idx_type nr = x.rows ();
- octave_idx_type nc = x.columns ();
+ NDArray retval (x.dims ());
+ double *r_data = retval.fortran_vec ();
- Matrix retval (nr, nc);
+ const double *x_data = x.data ();
- for (octave_idx_type j = 0; j < nc; j++)
- for (octave_idx_type i = 0; i < nr; i++)
- {
- OCTAVE_QUIT;
- retval (i, j) = f (x (i, j), y);
- }
+ octave_idx_type nel = x.numel ();
+
+ for (octave_idx_type i = 0; i < nel; i++)
+ {
+ OCTAVE_QUIT;
+ r_data[i] = f (x_data[i], y);
+ }
return retval;
}
-static Matrix
-map_m_m (d_dd_fcn f, const Matrix& x, const Matrix& y)
+static NDArray
+map_m_m (d_dd_fcn f, const NDArray& x, const NDArray& y)
{
- octave_idx_type x_nr = x.rows ();
- octave_idx_type x_nc = x.columns ();
+ assert (x.dims () == y.dims ());
- octave_idx_type y_nr = y.rows ();
- octave_idx_type y_nc = y.columns ();
+ NDArray retval (x.dims ());
+ double *r_data = retval.fortran_vec ();
- assert (x_nr == y_nr && x_nc == y_nc);
+ const double *x_data = x.data ();
+ const double *y_data = y.data ();
- Matrix retval (x_nr, x_nc);
+ octave_idx_type nel = x.numel ();
- for (octave_idx_type j = 0; j < x_nc; j++)
- for (octave_idx_type i = 0; i < x_nr; i++)
- {
- OCTAVE_QUIT;
- retval (i, j) = f (x (i, j), y (i, j));
- }
+ for (octave_idx_type i = 0; i < nel; i++)
+ {
+ OCTAVE_QUIT;
+ r_data[i] = f (x_data[i], y_data[i]);
+ }
return retval;
}
@@ -202,29 +203,18 @@
if (nargin == 2 && args(0).is_defined () && args(1).is_defined ())
{
- if (args(0).is_integer_type () || args(0).is_integer_type ())
+ if (args(0).is_integer_type () || args(1).is_integer_type ())
error ("atan2: not defined for integer types");
else
{
octave_value arg_y = args(0);
octave_value arg_x = args(1);
- octave_idx_type y_nr = arg_y.rows ();
- octave_idx_type y_nc = arg_y.columns ();
+ dim_vector y_dims = arg_y.dims ();
+ dim_vector x_dims = arg_x.dims ();
- octave_idx_type x_nr = arg_x.rows ();
- octave_idx_type x_nc = arg_x.columns ();
-
- int arg_y_empty = empty_arg ("atan2", y_nr, y_nc);
- int arg_x_empty = empty_arg ("atan2", x_nr, x_nc);
-
- if (arg_y_empty > 0 && arg_x_empty > 0)
- return octave_value (Matrix ());
- else if (arg_y_empty || arg_x_empty)
- return retval;
-
- octave_idx_type y_is_scalar = (y_nr == 1 && y_nc == 1);
- octave_idx_type x_is_scalar = (x_nr == 1 && x_nc == 1);
+ bool y_is_scalar = y_dims.all_ones ();
+ bool x_is_scalar = x_dims.all_ones ();
if (y_is_scalar && x_is_scalar)
{
@@ -244,7 +234,7 @@
if (! error_state)
{
- Matrix x = arg_x.matrix_value ();
+ NDArray x = arg_x.array_value ();
if (! error_state)
retval = map_d_m (atan2, y, x);
@@ -252,7 +242,7 @@
}
else if (x_is_scalar)
{
- Matrix y = arg_y.matrix_value ();
+ NDArray y = arg_y.array_value_value ();
if (! error_state)
{
@@ -262,13 +252,13 @@
retval = map_m_d (atan2, y, x);
}
}
- else if (y_nr == x_nr && y_nc == x_nc)
+ else if (y_dims == x_dims)
{
- Matrix y = arg_y.matrix_value ();
+ NDArray y = arg_y.array_value ();
if (! error_state)
{
- Matrix x = arg_x.matrix_value ();
+ NDArray x = arg_x.array_value ();
if (! error_state)
retval = map_m_m (atan2, y, x);
@@ -284,6 +274,14 @@
return retval;
}
+/*
+%! assert (size (atan2 (zeros (0, 2), zeros (0, 2))), [0, 2])
+%! assert (size (atan2 (rand (2, 3, 4), zeros (2, 3, 4))), [2, 3, 4])
+%! assert (size (atan2 (rand (2, 3, 4), 1), [2, 3, 4])
+%! assert (size (atan2 (1, rand (2, 3, 4)), [2, 3, 4])
+%! assert (size (atan2 (1, 2), [1, 1])
+*/
+
DEFUN (fmod, args, ,
"-*- texinfo -*-\n\
@deftypefn {Mapping Function} {} fmod (@var{x}, @var{y})\n\
@@ -298,25 +296,14 @@
if (nargin == 2 && args(0).is_defined () && args(1).is_defined ())
{
- octave_value arg_x = args(0);
- octave_value arg_y = args(1);
+ octave_value arg_y = args(0);
+ octave_value arg_x = args(1);
- octave_idx_type y_nr = arg_y.rows ();
- octave_idx_type y_nc = arg_y.columns ();
+ dim_vector y_dims = arg_y.dims ();
+ dim_vector x_dims = arg_x.dims ();
- octave_idx_type x_nr = arg_x.rows ();
- octave_idx_type x_nc = arg_x.columns ();
-
- int arg_y_empty = empty_arg ("fmod", y_nr, y_nc);
- int arg_x_empty = empty_arg ("fmod", x_nr, x_nc);
-
- if (arg_y_empty > 0 && arg_x_empty > 0)
- return octave_value (Matrix ());
- else if (arg_y_empty || arg_x_empty)
- return retval;
-
- octave_idx_type y_is_scalar = (y_nr == 1 && y_nc == 1);
- octave_idx_type x_is_scalar = (x_nr == 1 && x_nc == 1);
+ bool y_is_scalar = y_dims.all_ones ();
+ bool x_is_scalar = x_dims.all_ones ();
if (y_is_scalar && x_is_scalar)
{
@@ -336,7 +323,7 @@
if (! error_state)
{
- Matrix x = arg_x.matrix_value ();
+ NDArray x = arg_x.array_value ();
if (! error_state)
retval = map_m_d (fmod, x, y);
@@ -344,7 +331,7 @@
}
else if (x_is_scalar)
{
- Matrix y = arg_y.matrix_value ();
+ NDArray y = arg_y.array_value ();
if (! error_state)
{
@@ -354,13 +341,13 @@
retval = map_d_m (fmod, x, y);
}
}
- else if (y_nr == x_nr && y_nc == x_nc)
+ else if (y_dims == x_dims)
{
- Matrix y = arg_y.matrix_value ();
+ NDArray y = arg_y.array_value ();
if (! error_state)
{
- Matrix x = arg_x.matrix_value ();
+ NDArray x = arg_x.array_value ();
if (! error_state)
retval = map_m_m (fmod, x, y);
@@ -374,6 +361,14 @@
return retval;
}
+
+/*
+%! assert (size (fmod (zeros (0, 2), zeros (0, 2))), [0, 2])
+%! assert (size (fmod (rand (2, 3, 4), zeros (2, 3, 4))), [2, 3, 4])
+%! assert (size (fmod (rand (2, 3, 4), 1), [2, 3, 4])
+%! assert (size (fmod (1, rand (2, 3, 4)), [2, 3, 4])
+%! assert (size (fmod (1, 2), [1, 1])
+*/
#define NATIVE_REDUCTION_1(FCN, TYPE, DIM) \
(arg.is_ ## TYPE ## _type ()) \