C++ 2D增长数组像MATLAB一样

5
我阅读了一些关于C语言中动态增长数组的帖子,但我不知道如何创建一个二维增长数组(类似于MATLAB)。
我有一个用于某些图像处理的构建数组的函数,但我不知道这个数组的大小(列和行)。我该如何创建它?
我读到了一些关于malloc和realloc的内容。这些函数对于解决这个问题是可移植或有用的。
编辑:使用Armadillo库,一个C++线性代数库,已经解决了这个问题。

寻找一个专门用于矩阵分析的库。C++更加通用,标准库中没有类似的内容。 - Ben Voigt
5个回答

1

最简单的方法是使用指针

int nrows = 10;
int ncols = 5;

double* matrix = new double[mrows*ncols];

然后你可以像访问2D数组一样访问它。

所以如果你想要matrix[row][col],你需要这样做

int offset = row*ncols+col;
double value = matrix[offset];

另外,如果你想在C++中获得类似Matlab的矩阵般的舒适体验,请查看Armadillo


1
他正在寻找具有动态调整大小功能的解决方案。 - pmr
我原以为他的“动态”是在编译时创建一个未知大小的2D数组?我想我刚刚读错了。无论如何,Armadillo可能是他正在寻找的东西。它被设计成一个类似于Matlab的C++矩阵库。 - Chris
我正在使用armadillo库,但是无法调整arma::mat变量的大小。我使用了reshape方法,但是它只能调整行大小,如果我尝试调整列大小,则会出现错误:“运行时错误:Mat :: operator():越界”。 - matiasfha
嗯,这很奇怪。我刚试过了,它肯定是有效的。你应该发布你的代码,因为在我看来,获取arma::mat是更好的解决方案。 - Chris
终于找到了错误..只是一个愚蠢的错误...有了 Armadillo,这个问题得到完美解决... - matiasfha

1
如果你正在进行图像处理,你可能想要使用矩阵和数组类型来自OpenCV

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>

0

C++ 并没有一个标准的矩阵类。我认为这样的类有太多不同的用途,使得无法找到一个一刀切的解决方案。Stroustrup 的书中(The C++ Programming Language(第三版))提供了一个简单的数值矩阵实现示例和讨论。

但是,对于图像处理来说,最好使用现有的库。

你可以看看 CImg。我以前用过它,发现它快速而且文档完善。

如果你正在使用 AMD 机器,我知道 AMD 有一个针对图像处理进行优化的库,即 Framewave 项目 Framewave Project

此外,如果你习惯于 MATLAB 风格的代码,那么你可能需要看看 it++。我认为该项目的目标是尽可能与 MATLAB 相似。


0

+1 对于 OpenCV,特别是在进行图像分析时非常有用,因为它可以抽象出底层的数据类型(GRAYSCALE、RGB 等)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接