gpt4 book ai didi

c++ - 在 C++ 运行时将 1D 数组(指针)视为 3D 矩阵

转载 作者:搜寻专家 更新时间:2023-10-31 01:30:41 24 4
gpt4 key购买 nike

我收到一些图像数据作为 unsigned char *image = load_image(…);

此数据是一个 3D 矩阵:x (char)、y (char) 和 channel (RGB) (char)。

如何通过重载 [] 访问每个元素作为 image[x][y][channel]?例如。第 999 行,第 10000 列,绿色 channel :image[999][10000][1]

说明:

  1. 我想使用 C 多维数组语法:array[x][y][z],而不是 array[x * height * channels + y * channel + z]

  2. 我可以像访问二维数组一样访问一维数组:

    unsigned char (*imageMatrix)[height] = (unsigned char (*)[height])image
    imageMatrix[x][y] = 100
  3. I already asked如何在纯C中实现。这里我想知道如何在C++中更好地实现。

最佳答案

您可以创建 Image 类,其函数将获得您想要的内容

class Image {
int imgSize;
char * img;

public:
Image(): imgSize(0), img(nullptr) {}
Image(char* image, int size): imgSize(size), img(image) {}

char getPixel(int x, int y, int z) {
if(x < imgSize && y < imgSize && z < imgSize) {
return img[x * imgSize * imgSize + y * imgSize + z];
} else {
// Error
}
}

char operator(int x, int y, int z) {
// The same as getPixel
}
}

getPixel 在我看来是最好的方法,因为无论何时调用它,您(和使用您的代码的人)都会根据它的名字准确地知道您做了什么(即使在 6 个月后您也会立即知道你得到了一个像素)。重载 operator() 也是一个好方法,但如果它会导致混淆或不需要的行为,我不会使用它。两者都隐藏了类的内部结构并且不需要任何代理类。

重载 operator[] 是一种选择,但要支持像 [][][] 这样的链接,您需要代理类,这将严重影响代码的性能,如果设计不正确。

您可以阅读 C++ FAQ了解更多。

关于c++ - 在 C++ 运行时将 1D 数组(指针)视为 3D 矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47268036/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com