2012-08-06 29 views
4

Matlab能够区分“适当”矩阵乘法和不同运算符的元素方式矩阵乘法,因此前者的执行形式为A * B,后者的执行形式为A .* B。这很方便,我想知道是否有一种方法可以在C++中为自定义矩阵类实现相同的功能(并且同样适用于./.^)。也就是说,我不知道是否有可能通过定义宏或任何其他方法,有像真正的编译如下:在C++中定义类似Matlab的。*运算符?

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 S和无法获得它工作,所以我想我会把它放到SO上。我可以接受'错过',即如果.*无法正常工作,但不知何故:*可以,足够好。注意,我专门寻找操作符 - 当然,这种行为可以通过函数以明显的方式完成,但类似Matlab的操作符会非常方便。

+0

如果你发现你显然不会使用这种“很方便”哟用于“正常”目的的矩阵 - 线性算子,用*作为组成 - 但对于其他情况,其中'*'作为矩阵乘法可能没有太大意义。所以你可能需要两个不同的类,一个用于线性映射矩阵,另一个用于元素矩阵,每个都有自己的'operator *'。如果您需要从一种表示法转到另一种表示法,则可以添加显式或隐式转换函数。这样,它不仅会更明了,而且比Matlab版本更安全。 – leftaroundabout 2012-08-06 00:38:30

+0

@leftaroundabout你是否熟悉Matlab?就像我描述的那样,情况就存在那里。在任何情况下,已经使用Matlab(和矩阵)了很多,肯定会出现这样的情况:对于给定的矩阵,您将在某一点上想要对其进行标准矩阵乘法运算,而在另一种情况下, 。所以这会很方便。 – 2012-08-06 01:22:06

+0

据我所知,matlab中的'。*'是做标量乘,它与矩阵乘法不同。在C++中,您可以完全使用一个运算符'*'并执行运算符/函数重载。 – texasbruce 2012-08-06 02:08:13

回答

2

不是我真的建议这样做(这是一种憎恶)。你可以说,创建一个小包装类,当乘以矩阵执行元素乘法。然后给矩阵类一个element_wise()方法,它返回这样一个包装。然后,你冷“创造”运营商_*_/等:

#define _ .element_wise() 

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

或保留预处理器出来的,通过给每个矩阵在建设这样的包装,把它_,从而使:

A = B ._* C; 
B = A ._/ C; 
+0

这是一个可怕的建议。宏几乎永远不会走,而将'_'定义为宏是在寻求麻烦。我特别使用'_'来代替*不关心*参数,而这个宏会以许多不同的方式破坏我的代码。 – 2012-08-06 03:23:11

+0

@DavidRodríguez - dribeas不直接回答开始“不是我真的建议这样做”?这是一个*假设的*解决方案。实际上,如果你的代码中断了这个宏,这真的不是这个宏的问题:) – 2012-08-06 06:55:41

+0

@RodyOldenhuis:宏破坏代码,问题是有一些完美工作的代码会停止工作,如果这样一个宏被定义为。你可能不认为这是一个问题,但认为我可以''定义我*复杂(0.,1)'使代码更像数学:'复杂 a = 5我;'如果您使用'我'作为一个变量是你的问题......我的宏很好! '#define T typedef'怎么样,它使我的类型定义更好!说真的,一般应该避免使用宏,并且没有遵循惯例的所有宏(全部是大写,长名)。 – 2012-08-06 12:17:11

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; 
}; 
+0

+1的工作示例。 – 2012-08-06 21:32:11