我有两个密集矩阵M,N,我想计算M * N,而不是在对元素进行操作时使用常规乘法,我想*表示取两个中的最小值(但是+仍然是加法)
例如,如果
M =
(1 2)
(3 4)
然后
M*M =
(1+2 1+2)
(1+3 2+4)
=
(3 3)
(4 6)
因为根据点积的执行方式,(1 2)*(1 3)= min(1,1)+ min(2,3)= 1 + 2,依此类推。
这一切都可能吗?也许有模板类,其中定义了二元运算*或什么?
谢谢。
编辑:正如建议的那样,我尝试定义自己的标量类型,但它不起作用。
试试这个:
#include <iostream>
#include <eigen3/Eigen/Dense>
using namespace std;
struct my_scalar
{
my_scalar(double a = 0.0) : value(a) {}
operator double&() { return value; }
operator double() const { return value; }
double value;
};
using Matrix = Eigen::Matrix<my_scalar,Eigen::Dynamic,Eigen::Dynamic>;
inline my_scalar operator*(const my_scalar& x, const my_scalar& y)
{
return my_scalar(min(x.value,y.value));
}
inline my_scalar operator+(const my_scalar& x, const my_scalar& y)
{
return my_scalar(x.value+y.value);
}
inline my_scalar operator-(const my_scalar& x, const my_scalar& y)
{
return my_scalar(x.value-y.value);
}
int main()
{
Matrix A(2,2);
A(0,0) = my_scalar(1);
A(1,0) = my_scalar(3);
A(0,1) = my_scalar(2);
A(1,1) = my_scalar(4);
cout << "A = " << endl << A << endl;
cout << "A*A = " << endl << A*A << endl;
}
输出结果是A * A是一个四个1的矩阵!
答案 0 :(得分:1)
您需要定义自己的标量类型,并根据需要定义所有算术运算符。然后,将它插入到Eigen的矩阵中,即'Matrix',然后完成。不好的一面是你会松开显式矢量化。
修改强>
为了确保它能按预期工作,你必须要小心,因为Eigen的矩阵产品实现有时会假设1
是乘法身份,而不是你的情况。这条代码路径可以优化足够大的矩阵乘积,因此您可以使用A.lazyProduct(B)
始终遵循从不做出这种假设的简单矩阵乘积路径。