有没有办法在线性代数库中设置*意味着什么?

时间:2017-06-27 20:56:58

标签: eigen blas eigen3

我有两个密集矩阵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的矩阵!

1 个答案:

答案 0 :(得分:1)

您需要定义自己的标量类型,并根据需要定义所有算术运算符。然后,将它插入到Eigen的矩阵中,即'Matrix',然后完成。不好的一面是你会松开显式矢量化。

修改

为了确保它能按预期工作,你必须要小心,因为Eigen的矩阵产品实现有时会假设1是乘法身份,而不是你的情况。这条代码路径可以优化足够大的矩阵乘积,因此您可以使用A.lazyProduct(B)始终遵循从不做出这种假设的简单矩阵乘积路径。