C++内存分配.矩阵
C++ Memory allocation. Matrix
我研究了两种不同的方法来为矩阵的元素分配内存
方法n.1
int** matrix = new int*[rows];
for (int i = 0; i < rows; ++i)
matrix[i] = new int[cols];
方法n.2
int** matrix = new int*[rows];
if (rows)
{
matrix[0] = new int[rows * cols];
for (int i = 1; i < rows; ++i)
matrix[i] = matrix[0] + i * cols;
}
我可以弄清楚方法n.1的作用,但我不知道方法n.2中的if子句到底应该做什么(我会在没有if子句的情况下实现它,但它不起作用,有if子句时,它起作用…)
编辑:这是一个显示我的问题的代码。为什么加载需要这么长时间(约30秒)?
http://codepad.org/uKvI8Tk3
Codepad拒绝显示输出(超时),所以如果您想运行它,只需自己编译即可。
此外,为什么cout<lt;程序启动后不执行语句?
方法n.3:编写自己的Matrix类,在内部使用单个std::vector<int>
,并巧妙地通过(row,col)索引进行访问。
struct Matrix
{
explicit Matrix(unsigned int rows, unsigned int cols) : data_(rows*cols), cols_(cols) {}
const int& operator()(unsigned int row, unsigned int col) const
{
return data_[row*cols_ + col];
}
private:
std::vector<int> data_;
unsigned int cols_;
};
编辑:iff在上一个例子中,向量的内存开销是一个问题,您可以考虑使用单个长度为rows*cols
的动态分配数组,并确保在析构函数中对其调用delete []
。
方法n.2正在分配一个唯一的块来包含所有行的序列。因此,第一行是指向整个块的指针。如果行==0,则没有空间容纳指向(空)空间的指针,因此无法进行分配。
我会转向另一个答案中建议的方法4:
class Matrix {
Matrix(int rows, int cols): rows_(rows), cols_(cols) {
data_ = new int[rows*cols];
}
~Matrix() {
delete[] data_;
}
int &operator()(int i,int j) {return data_[cols_*i+j];}
int operator()(int i,int j) const {return data_[cols_*i+j];}
private:
int rows_,cols_;
int *data_;
};
相关文章:
- 使用指针在存在特征库的情况下动态分配 c++ 中的矩阵
- 如何动态分配由三重指针到类的矩阵?
- 使用动态分配的数组进行矩阵乘法;结果不正确
- 如何确保动态分配的矩阵是平方的?
- 如何进行放置分配特征::矩阵到共享内存(或堆)?
- 在动态分配的二维矩阵中插入新列
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 在另一个分配的矩阵中为特定范围创建 cv::Mat 标头
- 将 OpenCV 矩阵分配给数据结构
- 在为矩阵分配值时访问冲突写入位置0x00000000
- C ,重新定义操作员=,为矩阵分配一个子序列
- 矩阵分配导致崩溃
- 如何在opencv中创建cv::matrix的向量,并将图像数据的子矩阵分配给向量的所有索引上的矩阵
- 使用 valuePtr() 等为 Eigen3 稀疏矩阵分配空间
- 在CUDA中以混合(HYB)格式为稀疏矩阵分配内存
- 为矩阵(n*1)分配内存
- 为矩阵分配一个新的内存
- 为对象矩阵分配一个新的内存
- 使用引用运算符 (&) 为矩阵分配随机值
- 如何有效地为20000*20000矩阵分配内存