1

我有一个 for 循环,需要将列增量添加到矩阵中。在进入 for 循环之前,行的大小是已知的,但列的大小会根据某些条件而变化。以下代码说明了这种情况:

  N = getFeatureVectorSize();
  float **fmat; // N rows, dynamic number of cols     
  for(size_t i = 0; i < getNoObjects(); i++)
  {
    if(Object[i] == TARGET_OBJECT)
    {
      float *fv = new float[N];
      getObjectFeatureVector(fv);    
      // How to add fv to fmat?
    }
  }

编辑 1这就是我临时解决问题的方法:

  N = getFeatureVectorSize();
  float *fv = new float[N];
  float *fmat = NULL;
  int col_counter = 0;
  for(size_t i = 0; i < getNoObjects(); i++)
  {
    if(Object[i] == TARGET_OBJECT)
    {
      getObjectFeatureVector(fv);    
      fmat = (float *) realloc(fmat, (col_counter+1)*N*sizeof(float));
      for(int r=0; r<N; r++) fmat[col_counter*N+r] = fv[r];
      col_counter++;
    }
  }
  delete [] fv;
  free(fmat);

但是,我仍在寻找一种在 C/C++ 中增量分配二维数组内存的方法。

4

4 回答 4

1

回答你原来的问题

// 如何将 fv 添加到 fmat?

当您使用时,float **fmat您正在声明一个指向 [an array of] 指针的指针。因此,您必须先分配(并释放!)该数组,然后才能使用它。将其视为行指针持有者:

float **fmat = new float*[N];

然后在你的循环中你只需做

fmat[i] = fv;

但是,我建议您查看该std::vector方法,因为它不会显着变慢,并且会让您免于所有这些newdelete.

于 2013-07-23T15:24:06.983 回答
0

为了详细说明该std::vector方法,它看起来像这样:

// initialize
N = getFeatureVectorSize();
vector<vector<float>> fmat(N);

现在循环看起来一样了,您可以通过 访问行fmat[i],但是没有指向浮点数的指针。您只需调用fmat[i].resize(row_len)设置大小,然后使用fmat[i][z] = 1.23.

在您的解决方案中,我建议您getObjectFeatureVector返回 a vector<float>,因此您可以说fmat[i] = getObjectFeatureVector();。感谢 C++11 移动构造函数,这将与分配指针一样快。此解决方案还将解决getObjectFeatureVector不知道数组大小的问题。

编辑:据我了解,您不知道列数。没问题:

deque<vector<float>> fmat();

鉴于此功能:

std::vector<float> getObjectFeatureVector();

这是添加另一列的方式:

fmat.push_back(getObjectFeatureVector());

fmat.size()数为 ,一列中的行数为fmat[i].size()

于 2013-07-23T15:30:59.187 回答
0

更好 - 使用 boost::MultiArray 作为这里的最佳答案:

如何最好地处理 C/C++ 中的动态多维数组?

尝试动态分配您自己的矩阵类型是您不需要的痛苦。

或者 - 作为一种低技术、快速和肮脏的解决方案,使用向量的向量,如下所示:

向量的 C++ 向量

于 2013-07-23T13:26:21.603 回答
0

如果您想在没有花哨的数据结构的情况下执行此操作,则应声明fmat为大小为 N 的指针数组。对于每一列,您可能只需要猜测一个合理的大小即可。动态分配该浮点数的数组,并将适当的元素设置fmat为指向该数组。如果空间不足(例如,要向该列添加更多浮点数),请尝试分配一个两倍于先前大小的新数组。更改适当的元素fmat以指向新数组并释放旧数组。

这种技术有点难看,如果你的预测不好,可能会导致很多分配/解除分配,但我以前用过。如果您需要在不使用其他人的数据结构的情况下进行动态数组扩展,那么这将是您所能得到的。

于 2013-07-23T13:29:23.427 回答