我有一个2048x2048灰度图像矩阵,我想找到一些值> 0的点,并将其位置存储到2列n行的数组中(n也是建立点的数量)这是我的算法:

int icount;
icount = 0;
for (int i = 0; i < 2048; i++)
{
    for (int j = 0; j < 2048; j++)
    {
        if (iout.at<double>(i, j) > 0)
        {
            icount++;
            temp[icount][1] = i;
            temp[icount][2] = j;
        }
    }
}

我有2个问题:

  1. temp是一个行数未知的数组,因为每次循环后行数都会增加,那么如何定义temp数组呢? 稍后我需要用于另一种实现的确切行数,因此我无法为其提供一些随机数。
  2. 我上面的算法不起作用,结果是

     temp[1][1]=0 , temp[1][2]=0 , temp[2][1]=262 , temp[2][2]=655 

    这是完全错误的,正确的是:

     temp[1][1]=1779 , temp[1][2]=149 , temp[2][1]=1780 , temp[2][2]=149 

    我得到了正确的结果,因为我在Matlab中实现了

     [a,b]=find(iout>0); 

===============>>#1 票数:2

怎么样std :: vectorstd :: pair

std::vector<std::pair<int, int>> temp;

然后使用push_back向其添加(i, j)对。 无需事先知道大小:

temp.push_back(make_pair(i, j));

我们需要更多地了解您的问题和您的代码,以便能够分辨出该算法出了什么问题。

===============>>#2 票数:1

当定义指针类型的变量时,需要分配内存,并使指针指向该内存地址。 在您的情况下,您有一个多维指针,因此它需要多个分配。 例如:

int **temp = new int *[100]; // This means you have room for 100 arrays (in the 2nd dimension)
int icount = 0;
for(int i = 0; i < 2048; i++) {
   for(int j = 0; j < 2048; j++) {
      if(iout.at<double>(i, j) > 0) {
         temp[icount] = new int[2]; // only 2 variables needed at this dimension
         temp[icount][1] = i;
         temp[icount][2] = j;
         icount++;
      }
   }
}

这将为您工作,但仅当您确定您不需要的只是预分配的数组大小(在此示例中为100)时,这才是好事。 如果您确切知道需要多少,则可以使用此方法。 如果您知道最大可能的话,也可以,但是可能很浪费。 如果您不知道第一维需要什么大小,则必须使用动态集合,例如IVlad建议的std::vector 如果确实使用了我建议的方法,请不要忘记使用delete []temp[i];释放已分配的内存delete []temp[i]; delete []temp;

  ask by Phạm Xuân Hiển translate from so

未解决问题?本站智能推荐: