从数组中获取一个块

时间:2012-11-23 14:45:53

标签: c++ arrays

我有以下数组

   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 

当我在子数组上进行一些计算时,我也希望在大数组中产生影响。

例如我有一个Matrix类

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 个答案:

答案 0 :(得分: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函数返回SubMatrix operator =Matrix超载SubMatrix(一个人占用operator =,可能还有其他运营商, Matrix中的SubMatrix获取{{1}}等。

然后,这个辅助类将在给定窗口读取/写入原始矩阵。

答案 1 :(得分:1)

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

Numerical Python使用这样的设计取得了很大的成功。

答案 2 :(得分:0)

如果你问如何写它,那就是一件事。

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

您使用的具体课程是boost::multi_array_refboost::const_multi_array_ref

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

答案 3 :(得分: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;
};