4

Matlab は、「適切な」行列乗算と要素ごとの行列乗算を異なる演算子で区別できるため、前者は として実行されA * B、後者は として実行されA .* Bます。./これは非常に便利で、C++ でカスタム マトリックス クラス (およびと同様) に対して同じことを達成する方法があるかどうか疑問に思っていました.^。つまり、マクロやその他の方法を定義することで、次のようなものを実際にコンパイルできるかどうか疑問に思っていました。

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に入れることにしました。私は「ニアミス」を受け入れることが.*でき:*ます. NB、私は特に演算子を探しています。もちろん、この動作は関数で明白な方法で実現できますが、Matlab のような演算子は非常に便利です。

4

2 に答える 2

4

これは、マクロを使用しない場合にのみ、マナグの答えに似たテクニックです...

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 に答える