2

我有以下数组

   75.7740   70.6046   82.3458   43.8744   48.9764
   74.3132    3.1833   69.4829   38.1558   44.5586
   39.2227   27.6923   31.7099   76.5517   64.6313
   65.5478    4.6171   95.0222   79.5200   70.9365
   17.1187    9.7132    3.4446   18.6873   75.4687

我想得到例如从 (1,1) 到 (2,2) 子数组

3.1833   69.4829  
27.6923   31.7099 

当我对子数组进行一些计算时,我也想影响大数组。

例如我有一个矩阵类

template<class T>
class Matrix {
private:
    unsigned rows, cols;
    T* data_;
        .....
}

测试

MatrixXd u(5, 5);
MatrixXd d(2, 2);
....
u.subblock(1,1,2,2) = d*d
or
u(1,1,2,2) = d*d

我已经重载了一些运算符,如 ()/*-+ 等,但我不知道我可以操作子数组。

4

4 回答 4

2
u.subblock(1,1,2,2) = d*d

要获得如上述工作的一行,您可以定义一个辅助类:

template<class T>
class SubMatrix {
private:
    Matrix<T> *origin;
    unsigned int sr, sc, er, ec; // start and end row and column
        .....
};

然后你的Matrix::subblock函数返回一个SubMatrixoperator =重载的 a Matrix(并且一个采用 aSubMatrix和可能的其他运算符,以及一个operator =采用MatrixaSubMatrix等)。

然后,此帮助程序类将在给定窗口中读取/写入原始矩阵。

于 2012-11-23T14:58:53.277 回答
1

一种可能的设计是让子矩阵成为主矩阵相关部分的视图。换句话说,视图不会管理自己的存储,而是简单地重用主矩阵的存储。当视图被修改时,主矩阵也会被修改。

数值 Python 使用这种设计取得了很大的成功。

于 2012-11-23T14:56:35.027 回答
0

如果你问怎么写,那是一回事。

如果您想要一个已经编写好的解决方案,请查看 Boost 的multi_array。通过一些存储开销优化,您可以获得 N 维矩阵。

您将使用的特定类是boost::multi_array_refboost::const_multi_array_ref

(注意:来自经验的公平警告......这些还没有准备好像unique_ptr此时那样存储 C++11 只移动类型。)

于 2012-11-23T15:05:07.383 回答
0

实际问题是您的矩阵类支持太多操作。所需的最低操作如下所示:

class MatrixI {
public:
  virtual int SizeX() const=0;
  virtual int SizeY() const=0;
  virtual float Map(int x, int y) const=0;
}

因此,要使这一切正常工作,您应该根据上述接口实现您的操作 +、* 等:

class Matrix {
public:
   /* +,* -operations here */
private:
   MatrixI *ptr; // owned ptr
};

那么子矩阵就是从 MatrixI 到 MatrixI 的运算:

class SubMatrix : public MatrixI {
public:
SubMatrix(MatrixI *orig, int pos_x, int pos_y, int sx, int sy);
/* implement minimum required functions here */
private:
  MatrixI *orig;
  int pos_x, pos_y;
  int sx,sy;
};
于 2012-11-23T16:09:26.507 回答