在C ++

时间:2015-05-17 11:17:51

标签: c++ arrays algorithm matlab

我有一个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;
        }
    }
}

我有两个问题:

  1. temp是一个数组,其行数未知&#39;因为每次循环后行数增加,所以如何定义临时数组?我需要稍后为另一个实现准确的行数,所以我不能为它提供一些随机数。
  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);
    

2 个答案:

答案 0 :(得分:2)

std::vectorstd::pair

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

然后使用(i, j)为其添加push_back对。无需事先知道尺寸:

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

我们需要更多地了解您的问题和代码,以便能够判断算法有什么问题。

答案 1 :(得分: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;

释放分配的内存