线性代数的过载操作员

overloading operator for linear algebra

本文关键字:操作员 线性代数      更新时间:2023-10-16

我想在二维上实现欧拉方法,并且我不想使用任何库(用于练习)。因此,我想将自己的线性代数与超载功能一起使用。两个第一个超载似乎有效,但乘法矩阵 *向量即a(2x2) *(2x1)。

仍然存在问题。
class vector{
    public:
        double a;
        double b;
        vector::vector();
        vector::vector(double a, double b){
            this->a = a;
            this->b = b;
        };
        vector operator+(vector &a);
        vector operator*(double factor);
        vector operator*(matrix &B);
    };
    class matrix{
    public:
        double a1;
        double a2;
        double b1;
        double b2;
        matrix::matrix();
        matrix::matrix(double a1, double a2, double b1, double b2) {
            this->a1 = a1;
            this->a2 = a2;
            this->b1 = b1;
            this->b2 = b2;
    };  
    };
    vector vector::operator+(vector& v){
        return vector(this->a+v.a,this->b+v.b);
    };
    vector vector::operator*(double factor){
        return vector(this->a*factor, this->b*factor);
    };
    vector vector::operator*(matrix& B){
        vector newv(this->a*B.a1 + B.a2*b, this->a*B.a1 + B.b2*b);
        return newv;
    };

我编译时出错:'向量向量::操作员 *(矩阵&)':在'vector''

中找不到超载成员函数

无法解析功能过载

由于您的详细信息有点短,因此我必须用猜测来填补空白。我的猜测是您尝试支持以下内容:

matrix m;
vector v, w;
// fill m and v with values
w = m*v;

我还猜测您的矩阵具有以下形式:

( a1 a2 )
( b1 b2 )

您现在有两个选项:在matrix类中实现Matrix-vector乘法,或以免费功能实现。

如果要放入matrix类,则将代码更改为以下(请注意,该代码还有更多内容,应该更改问题):

class vector
{
  // omit the operator* for matrix, otherwise unchanged
};
class matrix
{
  // all that's already in the class
  vector operator*(vector const& v) const;
};
vector matrix::operator*(vector const& v) const
{
  return vector(a1*v.a + a2*v.b, b1*v.a + b2*v.b);
}
// the rest of your code

如果您想使其成为一个免费的功能(我个人会那样做,但是我敢肯定意见不是普遍持有的),您会写

class vector
{
  // omit the operator* for matrix, otherwise unchanged
};
class matrix
{
  // completely unchanged
};
vector operator*(matrix const& m, vector const& v)
{
  return vector(m.a1*v.a + m.a2*v.b, m.b1*v.a + m.b2*v.b);
}
// the rest of your code

我希望长期将BLAS库作为实现,反对再次重新发明基本矩阵操作的轮子。另外,一些Blas库是多线程和/或基于GPU的;它们被广泛使用和测试。

在设计方面,我会介绍BLA可以轻松实施的功能针对操作员:

C = α * A + β * B
C = α * A * B + β *C

作为标头:

...
bool blasAdd(const double alfa_, const Matrix& A_, const double beta_, const Matrix& B_, Matrix& C_);
bool blasMultiply(const double alfa_, const Matrix& A_, const Matrix& B_, const double beta_, Matrix& C_);
...

以这种方式,您的代码可以自动针对Blas进行优化。

我最喜欢的Blas实施是Intel MKL,但市场上也有许多免费的BLAS实现(例如:Boost Blas)。