【问题标题】:C++, redefine operator =, assign a submatrix to the matrixC++,重新定义运算符=,为矩阵分配子矩阵
【发布时间】:2012-11-01 18:17:14
【问题描述】:

在类矩阵中

typedef std::vector < std::vector <double> > TItems;
class Matrix
{
   private :
             TItems items;

   public:
           double & operator() ( int r, int c ) {return items[r][c];}
           Matrix & operator = (const Matrix A, short r1, short r2, short c1, short c2 )

}

我正在尝试重新定义运算符 = 以便能够将子矩阵分配给矩阵。

Matrix  & operator = (const Matrix &A, short r1, short r2, short c1, short c2)
{
  Matrix  A_sub( r2 - r1 + 1, c2 - c1 + 1 );

  for ( int i = 0; i < ( r2 - r1 + 1 ); i++ )
  {
    for ( unsigned int j = 0; j < ( c2 - c1 + 1); j++ )
        items[i][j] = A (r1 + i, c1 + j );
  }

  return *this;
 }

但是这样的定义是不可能的……如果需要这种类型的符号,如何解决问题?

Matrix A(8,8), B (3,9), C(3,4), D(2, 3), E (8, 8);, F(8,8)
...
A(1,3,2,5) = B (0,2,5,8) + C(0,2,0, 3) + D;
F = A + E;

感谢您的帮助。

【问题讨论】:

  • 要写入的矩阵的维度是否发生了变化?
  • @Tom : 赋值前后A矩阵的维度不会改变...
  • 您必须创建一个 Submatrix 类,为该类定义 operator=()(重载),并使 Matrix::operator()(int,int,int,int) 返回一个 Submatrix。 Submatrix 只是 Matrix 的一个小代理,它保留对 Matrix 和边界的引用。所有操作都转发到主矩阵。
  • @n.m.但是在矩阵运算中会出现不同类型的(矩阵和子矩阵)。也许会带来一些问题。运算符 + 也必须重新定义...

标签: c++ matrix assignment-operator


【解决方案1】:

我认为最简单的解决方案是保持相同的类型,并创建一个方法来创建一个较小的子矩阵(仍然是Matrix 类型),复制值并返回按价值计算。

class Matrix {
public:
  Matrix createSubMatrix(size_t ri, size_t ci, size_t rsz, size_t csz);
};

那么您的加法、赋值等操作在尝试转换其他类型时不会承担额外的开销。

您将支付Matrix 副本的开销,但我不会在您生命中的这一点上强调这一点。 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多