我对c ++很新,我正在尝试编程strassen算法来乘法矩阵。部分算法要求我将矩阵分成四个部分,例如
4 5 6 7
6 7 8 9
1 2 3 4
2 3 5 6
分配:
4 5 6 7
6 7 8 9
1 2 3 4
2 3 5 6
(然后递归地再次使用每个部分并进行分区)。我想分割矩阵而不循环和复制原始矩阵中的数据(因为这将花费更多的时间)。我正在阅读的书中说,使用'索引计算来划分矩阵,通过一系列行索引和原始矩阵的一系列列索引来识别子矩阵。我不确定这是什么意思。
另外,我不确定我是否应该使用2D数组或向量?我见过很多人推荐矢量但是我已经在2D数组中编写了所有内容,所以我希望我想要的是二维数组。
p.s可以假设矩阵的维数总是2的幂并且是nxn(正方形)。此外,我已经看到了很多与此类似的问题,但它们实际上都没有我想要的解决方案。
由于
答案 0 :(得分:1)
您可以创建一个矩阵类,直接支持子矩阵作为视图:
template<typename T>
struct Matrix {
int rows, cols, stride;
std::vector<T> data; // Possibly empty for a view
T *ptr;
// A fresh matrix (owning its data)
Matrix(int rows, int cols)
: rows(rows), cols(cols), stride(cols),
data(rows*cols),
ptr(&data[0])
{
}
// A view of a sub-matrix (pointing to the original data!)
Matrix(Matrix& m, int row0, int col0, int rows, int cols)
: rows(rows), cols(cols), stride(m.stride),
ptr[&m(row0, col0)]
{
}
T& operator()(int row, int col) {
return ptr[row*stride + col];
}
...
};
当然,您需要确保视图不会超过拥有的矩阵,并且如果不禁止该操作,您需要注意复制视图对象的意思。
添加显式操作(如将视图转换为拥有矩阵)可能很有用(如果复制构造函数不会这样做)。