view liboctave/bsxfun.h @ 14025:9867be070ee1

use pcre/pcre.h if it is present * configure.ac: Check for pcre/pcre.h. * liboctave/regexp.cc: Include either pcre.h or pcre/pcre.h depending on which is available.
author John W. Eaton <jwe@octave.org>
date Sun, 11 Dec 2011 22:35:13 -0500
parents aa4a23337a0f
children c3d401562410
line wrap: on
line source

/*

Copyright (C) 2011 Jordi GutiƩrrez Hermoso <jordigh@octave.org>

This file is part of Octave.

Octave is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 3 of the License, or (at your
option) any later version.

Octave is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
for more details.

You should have received a copy of the GNU General Public License
along with Octave; see the file COPYING.  If not, see
<http://www.gnu.org/licenses/>.

*/
#if !defined (bsxfun_h)
#define bsxfun_h 1

#include <algorithm>

#include "Array.h"
#include "dim-vector.h"

inline
bool
is_valid_bsxfun (const dim_vector& dx, const dim_vector& dy)
{
  for (int i = 0; i < std::min (dx.length (), dy.length ()); i++)
    {
      octave_idx_type xk = dx(i), yk = dy(i);
      // Check the three conditions for valid bsxfun dims
      if (! ( (xk == yk) || (xk == 1 && yk > 1) || (xk > 1 && yk == 1)))
        return false;
    }
  return true;
}

// since we can't change the size of the assigned-to matrix, we cannot
// apply singleton expansion to it, so the conditions to check are
// different here.
inline
bool
is_valid_inplace_bsxfun (const dim_vector& dr, const dim_vector& dx)
{
  octave_idx_type drl = dr.length (), dxl = dx.length ();
  if (drl < dxl)
    return false;

  for (int i = 0; i < drl; i++)
    {
      octave_idx_type rk = dr(i), xk = dx(i);

      // Only two valid canditions to check; can't stretch rk
      if (! ( (rk == xk) || (rk > 1 && xk == 1)))
        return false;
    }
  return true;
}

#include "bsxfun-defs.cc"

#endif