我在C中读过一些关于动态增长数组的帖子,但是我看不出如何创建2D增长数组(就像在MATLAB中一样)。
我有一个函数为一些图像处理构造一个数组,但我不知道这个数组的大小(cols和rows)。我该如何创建呢?
我读了一些关于malloc和realloc的内容。这些功能是可移植的或对此问题有用。
编辑:已解决,使用Armadillo library,一个C ++线性代数库。
答案 0 :(得分:1)
答案 1 :(得分:1)
最简单的是指针
int nrows = 10;
int ncols = 5;
double* matrix = new double[mrows*ncols];
然后您可以像访问2D数组like一样访问它。
所以,如果你想要matrix[row][col]
,你可以做
int offset = row*ncols+col;
double value = matrix[offset];
另外,如果你想在C ++中像Matlab一样舒适,请查看Armadillo
答案 2 :(得分:0)
通过像Matlab一样增长数组,我假设你的意思是:
mat = [mat; col]
您可以在C ++中调整矩阵的大小,但不能使用如上所述的干净语法。
例如,您可以使用std::vector<std::vector<T>>
来表示矩阵。
std::vector<std::vector<int> > mat;
然后添加一列:
for (int i=0; i<mat.size(); i++) mat[i].push_back(col[i]);
或添加一行
mat.push_back(row); // row is a std::vector<int>
答案 3 :(得分:0)
C ++本身没有标准的矩阵类。我认为这样一个类有太多不同的用途,使得一个大小适合所有解决方案都不可能。 Stroustrup的书( The C++ Programming Language (第三版)中有一个例子和讨论关于数值矩阵的简单实现。
但是,对于图像处理,使用现有库要好得多。
您可以查看CImg。我之前使用过它并且发现它很快并且记录良好。
如果您使用的是AMD机器,我知道有一个优化的图像处理库来自AMD,即Framewave项目Framewave Project。
另外,如果您习惯使用MATLAB样式代码,那么您可能需要查看it++。 我认为项目的目标是让它尽可能与MATLAB相似。
答案 4 :(得分:0)
为OpenCV +1,在进行图像分析时特别有用,因为它抽象了基础数据类型(GRAYSCALE,RGB等)。