【发布时间】:2012-08-06 00:04:48
【问题描述】:
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 ./, .^
我尝试用一些简单的函数#defines 来做这件事,但无法让它工作,所以我想我会把它交给 SO。我可以接受“未遂事件”,即如果 .* 不能工作,但不知何故 :* 可以,就够了。注意,我专门寻找运算符——当然,这种行为可以通过函数以显而易见的方式完成,但类似 Matlab 的运算符会非常方便。
【问题讨论】:
-
如果您发现这个“非常方便”,您显然没有将矩阵用于“正常”目的——线性运算符,
*作为组合——而是用于其他东西,其中*因为矩阵乘法可能没有太大意义。所以你可能想要两个不同的类,一个用于线性映射矩阵,一个用于元素矩阵,每个都有自己的operator*。如果您需要从一种表示形式转换到另一种表示形式,您可以添加显式或隐式转换函数。这样,它不仅会更不言自明,而且比 Matlab 版本更安全。 -
@leftaroundabout 你熟悉 Matlab 吗?正如我所描述的那样,这种情况存在。无论如何,在大量使用 Matlab(和矩阵)之后,在某些情况下,对于给定的矩阵,您有时会想要对其进行标准矩阵乘法,而在另一种情况下,会进行一些元素操作.所以这会很方便。
-
据我所知,matlab中的
.*是做与矩阵乘法不同的标量乘法。在 C++ 中,您完全可以使用一个运算符*并进行运算符/函数重载。 -
嗯,这样的东西在 Matlab 中可以很方便并不奇怪,因为 Matlab 的重点是“一切都是矩阵”(恕我直言,数学上没有吸引力的观点:矩阵非常方便,但不是很多为了他们自己的利益,但为了表示更抽象的概念)。这不一定是好事。即使你有一个矩阵在一个点参与矩阵乘法,而在另一个点参与元素乘法,你要乘的矩阵 with 几乎肯定有完全不同的含义,因此应该有不同的类型.