Перегрузка операторов для увеличить интервал (векторов)


Я полный новичок в C++ и программирования в целом. Мне нужно написать нечто для научных целей, и как таковой, производительность имеет решающее значение.

Я представил двух типов матриц и векторов с интервалов в записи, а теперь хотят сделать из них "умеют работать", т. е. определения основных операций. Определения типа:

#include <eigen3/Eigen/Dense>
#include <boost/numeric/interval.hpp>

namespace bn = boost::numeric;
namespace bi = bn::interval_lib;

// Interval typedefs
using Interval = bn::interval<
        double,
        bi::policies<
            bi::save_state<bi::rounded_transc_std<double> >,
            bi::checking_base<double>
        >
    >;

using Matrix = Eigen::Matrix<Interval, 3, 3>;
using Vector = Eigen::Matrix<Interval, 3, 1>;

К счастью, матрица продукты работают без дополнительных определений (хотя мне нужно позвонить a.lazyProduct(b), в противном случае я получаю "оператор однозначное" ошибки, которые я не понимаю), но внутреннее продуктов и умножения с константами нет. Похоже, что мне придется вручную перегружать умножения, которые я сделал следующим образом:

Vector operator* (const double& x, const Vector& y)
  {
  Vector res;
  for(int i = 0; i<3;i++) {
    res[i] = x*y[i];
  }
  return res;
  }

Matrix operator* (const double& x, const Matrix& y)
  {
  Matrix res;
  for(int i = 0; i<3; i++) {
    for(int j = 0; j<3; j++){
      res(i,j) = x* y(i,j);
    }
  }
  return res;
  }

Interval inner_prod(const Vector& x, const Vector& y){
  Interval res(0.0);
  for(int i = 0; i<3; i++){
    res += x[i]*y[i];
  }
  return res;
}

Interval inner_prod(const std::vector<double>& x, const Vector& y){
  Interval res(0.0);
  for(int i = 0; i<3; i++){
    res += x[i] * y[i];
  }
  return res;
}

размеры жестко как я не будет работать с любым другим. Я хотел бы иметь некоторую обратную связь и предложения по улучшению, которые фокусируются на производительности. Также для внутреннего продукта, я надеялся, что есть способ использовать std::inner_product для возможного улучшения производительности, но я не могу выяснить, как.

В boost/numeric/interval.hpp заголовок дает определение умножения интервалов с скалярами, я, должно быть, допустили какую-то ошибку, что это не сработало. Что просто не оставляет мои пользовательские типы.



152
2
задан 26 января 2018 в 08:01 Источник Поделиться
Комментарии