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的操作符会非常方便。
答案 0 :(得分: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;
};
答案 1 :(得分:2)
并不是说我真的建议这样做(这是令人厌恶的)。比方说,你可以创建一个小的包装类,当乘以矩阵时会执行元素乘法。然后给矩阵类一个element_wise()
方法,它返回这样一个包装器。然后,你冷“创建”运算符_*
,_/
等:
#define _ .element_wise()
A = B _* C; // really B.element_wise() * C
或者让预处理器远离它,通过在构造中给每个矩阵这样一个包装器并调用它_
,从而允许:
A = B ._* C;
B = A ._/ C;