【问题标题】:C++ 2D growing array like MATLABC++ 2D 增长数组,如 MATLAB
【发布时间】:2011-03-18 19:32:34
【问题描述】:

我已经阅读了一些关于 C 中动态增长数组的帖子,但我看不到如何创建二维增长数组(如在 MATLAB 中)。

我有一个函数可以为一些图像处理构建一个数组,但我不知道这个数组的大小(列和行)。我该如何创建它?

我读过一些关于 malloc 和 realloc 的文章。这些函数对于这个问题是可移植的或有用的。

编辑:已解决,使用 C++ 线性代数库 Armadillo library

【问题讨论】:

  • 寻找专为矩阵分析设计的库。 C++ 用途更广泛,标准库中没有类似的内容。

标签: c++ arrays matlab


【解决方案1】:

最简单的是指针

int nrows = 10;
int ncols = 5;

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

然后您就可以像访问二维数组like 一样访问它。

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

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

另外,如果您想要像 C++ 中的矩阵一样使用 Matlab,请查看 Armadillo

【讨论】:

  • 他正在寻找动态调整大小的解决方案。
  • 我认为他的“动态”是在编译时创建一个未知大小的二维数组?我想我只是误读了它。无论如何,犰狳可能就是他当时正在寻找的东西。它被设计成一个用于 C++ 的 matlab -esq 矩阵库。
  • 我正在使用犰狳,但我无法调整 arma::mat 变量的大小.. 我使用 reshape 方法,但如果我尝试调整 cols 大小我只能调整行大小有一个错误:“运行时错误:Mat::operator(): out of bounds”..
  • 嗯。这很奇怪。我刚刚尝试过,它确实有效。你应该发布你的代码,因为得到 arma::mat 是一个更好的解决方案恕我直言。
  • 最后我发现了错误..这是一个愚蠢的错误......犰狳这工作完美无瑕......
【解决方案2】:

如果您正在进行图像处理,您可能希望使用matrixopencv 中的数组类型。

【讨论】:

    【解决方案3】:

    通过增加像 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>
    

    【讨论】:

      【解决方案4】:

      +1 用于 OpenCV,在进行图像分析时特别有用,因为它抽象了底层数据类型(GRAYSCALE、RGB 等)。

      【讨论】:

        【解决方案5】:

        C++ 本身没有标准的矩阵类。我认为这样一个类有太多不同的用途,这使得一刀切的解决方案变得不可能。 Stroustrup 的书 (The C++ Programming Language (第三版)) 中有一个关于数值矩阵的简单实现的示例和讨论。

        但是,对于图像处理,使用现有库要好得多。

        你可以看看CImg。我以前使用过它,发现它快速且有据可查。

        如果您使用的是 AMD 机器,我知道 AMD 有一个用于图像处理的优化库,即 Framewave 项目 Framewave Project

        另外,如果您习惯了 MATLAB 风格的代码,那么您可能需要查看 it++。 我认为该项目的目标是使其尽可能类似于 MATLAB。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-06-08
          • 2017-12-28
          • 2019-02-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-31
          相关资源
          最近更新 更多