2

我正在尝试从我正在阅读的 .txt 中填充一个数组。我正在使用此代码作为读取文件的函数:

double* read_text(const char *fileName, int sizeR, int sizeC)
{
    double* data = new double[sizeR*sizeC];
    int i = 0;
    ifstream myfile(fileName);
    if (myfile.is_open())
    {

        while (myfile.good())
        {
            if (i > sizeR*sizeC - 1) break;
            myfile >> *(data + i);
            //cout << *(data + i) << ' '; // Displays converted data.
            i++;
        }
        myfile.close();
    }

    else cout << "Unable to open file";
    //cout << i;

    return data;
}

现在,当我读取文件时,我试图从 1D 数据数组中获取元素并将它们存储到 2D 数组中。

我试图在公共类中创建一个数组,但是我不知道如何将我正在读取的数据移动到二维数组。

我知道这不是很清楚,但基本上我正在做最近邻搜索算法来比较 2 张图像。我已经拍摄了一张图像并使用上面的这段代码将其转换为值。但是现在我正在尝试将正在读取的数据存储到 2D 公共数组中?

4

2 回答 2

3

这是在 2D 矩阵中读取的更紧凑的版本:

int quantity = sizeR * sizeC;
double * matrix = new double [quantity];
double value = 0.0;
double * p_cell = matrix;
//...
while ((myfile >> value) && (quantity > 0))
{
  *p_cell++ = value;
  --quantity;
}

在上面的代码片段中,指针用于指向矩阵(二维数组)的下一个槽或单元。每次读取后指针递增。

递减作为quantity安全检查以防止缓冲区溢出。

于 2018-12-05T15:11:26.673 回答
0

假设每个返回的 double 代表一个像素。您可以定义一个检索像素的函数,如下所示:

double get_pixel(int x, int y, double* data, int sizeC)
{
    return data[x + y*sizeC];
}

其中sizeC是图像的宽度(列数)。

然后,您可以使用上面的函数来填充二维数组,如下所示:

for(int i = 0; i < sizeC; i++)
    for(int j = 0; j < sizeR; j++)
        my2Darray[i][j] = get_pixel(i, j, data, sizeC);

但请注意这是多么不必要。你真的不需要二维数组 :) 保持简单和高效。

上面的函数可能是一个结构的一部分,它表示您将 sizeC、sizeR 和数据定义为成员的 Image。

struct Image
{
    int sizeC;
    int sizeR;
    double* data;

    get_pixel(int x, int y)
    {
        return data[x + y*sizeC];
    }
};

然后要访问图像像素,您只需执行以下操作:

Image img;
// read image data and stuff
double p = img.get_pixel(4, 2);

您甚至可以通过覆盖 operator() 而不是 get_pixel 使其看起来更漂亮,因此检索像素看起来像:

double p = img(4, 2);
于 2018-12-05T15:21:13.193 回答