我有以下数组
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
我已经重载了一些像()/ * - +等操作符,但我不知道我可以操作子数组。
答案 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_ref和boost::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;
};