4

Matlab 能够区分“正确的”矩阵乘法和具有不同运算符的逐元素矩阵乘法,因此前者完成为A * B,后者完成为A .* B。这非常方便,我想知道是否有一种方法可以在 C++ 中为自定义矩阵类实现相同的功能(同样适用于./and .^)。也就是说,我想知道是否有可能通过定义宏或任何其他方法来实际编译如下内容:

MyMatrix A(2,3), B(2,3), C(2,3); //These are 2x3 matrices for the sake of concreteness
C = A .* B; //Similarly for ./, .^

我尝试用一​​些简单#define的函数来做这个,但无法让它工作,所以我想我会把它放到 SO 上。我可以接受'near misses',即如果.*不能工作但不知何故:*可以,就足够了。注意,我专门寻找运算符——当然,这种行为可以通过函数以显而易见的方式完成,但类似 ​​Matlab 的运算符会非常方便。

4

2 回答 2

4

这是一种与 Managu 的回答类似的技术,只是不使用宏......

struct Mat;
struct EleWise {
  EleWise(){}
  double mat[3][3];
};

struct Mat {
  Mat(){}

  friend Mat operator / ( EleWise& e, const Mat& m ) 
  { 
     return Mat(); // perform elewise divide
  }
  EleWise _;
};


int main( int argc, char** arg ) {
  Mat a;
  Mat b;

  Mat c = a ._/ b;
  return 0;
};
于 2012-08-06T02:42:35.937 回答
2

并不是说我真的建议这样做(这是可憎的)。比如说,你可以创建一个小的包装类,当它乘以一个矩阵时,它会执行一个元素乘法。然后给矩阵类一个element_wise()方法,它返回这样一个包装器。然后,您冷“创建”运算符_*,_/等:

#define _ .element_wise()

A = B _* C; // really B.element_wise() * C

或者通过在构造时给每个矩阵一个这样的包装器并调用它来将预处理器排除在外_,从而允许:

A = B ._* C;
B = A ._/ C;
于 2012-08-06T00:28:30.713 回答