【问题标题】:matrix class C++ as matlab operator overload矩阵类 C++ 作为 matlab 运算符重载
【发布时间】:2013-05-06 22:15:58
【问题描述】:

我有一个类定义一个维度为 mxn 的矩阵,如下所示:

class Matrix{
  protected:
  int m;
  int n;
  double* mat:
  public:
  // accessors, constructors, destructors, etc.
  void assignvalue(int, int, double);
}

现在,如果我需要在位置 i,j 上分配一个值,我有一个函数 assignvalue,它采用位置 i,j 并执行魔术并为该位置分配一个双精度值。但是,如果我能像您在 matlab 或 R 中那样分配一个值,那就太好了。

mymatrix(i,j) = 1.0;

你能告诉我我需要重载哪些运算符吗?谢谢。

【问题讨论】:

  • Morwenn 的回答是正确的,但我的经验法则是尽量不要重新发明轮子。查找已经提供线性代数运算的库。最近一直在用Eigen3,很满意。
  • 这是一个论文项目,部分问题是重新发明轮子。但感谢您的建议。这是有道理的。
  • 当然!每个人都应该重新发明轮子一次,只是为了了解它是如何工作的。但不适用于生产代码。

标签: c++ overloading operator-keyword numerical-methods


【解决方案1】:

假设您的 m 代表矩阵的高度,n 代表宽度,这样重载 operator() 应该可以解决问题:

double& Matrix::operator()(size_t i, size_t j)
{
    return mat[i*m+j];
}

const double& Matrix::operator()(size_t i, size_t j) const
{
    return mat[i*m+j];
}

这样,你可以这样写:

void f(Matrix & mymatrix ) {
   mymatrix(2, 3) = 5.0; // Calls the first function
   // ...
}
void f(Matrix const & m) {
   double a = m(1, 5); // Calls the second one
   //...
}

【讨论】:

  • 感谢您的快速回复。这有助于我从矩阵中获取值。就像 a = mymatrix(i, j);但我正在寻找相反的东西。更像 mymatrix(i,j) = a;
  • 它也可以工作,因为该函数有两个版本:const 和非const 一个。 const 将用于检索值,而另一个将用于设置它。
  • 请注意,// Calls the second one 的注释不正确。调度是使用调用成员函数的对象的类型完成的,在这种情况下,在两个使用行中都是相同的。假设第一个编译,mymatrixMatrix 类型的非常量对象,因此第二行将调用完全相同的运算符
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-04
相关资源
最近更新 更多