线性代数的过载操作员
overloading operator for linear algebra
我想在二维上实现欧拉方法,并且我不想使用任何库(用于练习)。因此,我想将自己的线性代数与超载功能一起使用。两个第一个超载似乎有效,但乘法矩阵 *向量即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)。
相关文章:
- 使用工程空间在软件包中导入的线性代数库EIGEN
- 特征库,简单的线性代数操作,具有稀疏的矩阵,增加了其分配的尺寸
- C++ OpenMP 中线性代数函数的高效并行化
- C++ 多个图像上的 OpenCV 线性代数?
- 带有 TooN 和 ROS 的线性代数
- 线性代数的过载操作员
- 线性代数转换矩阵 - 通过乘以矩阵从点到不同点
- 使用犰狳线性代数包存储矩阵需要多少内存
- 如何设计:矩阵的线性代数例程
- 具有复数的任意精度线性代数c/c++库
- 建议为C++选择一个线性代数库
- C++ eigen3 线性代数库,奇数性能结果
- 转换gsl线性代数以用于scalapack或其他并行矩阵库
- 线性代数的CPU指令集
- 结合线性代数库与Boost::Units
- 本征在其线性代数Ax=b中能否使用双精度以上?
- 特征线性代数求解器似乎很慢
- 矩阵/线性代数库的多态包装器-C++,从Eigen开始
- 线性代数-SVD在C/C++中求解harwell-boeing稀疏a.x=b系统
- 线性代数 - 使用犰狳C++的余弦相似性给了我负面的结果