将向量模拟为二维数组

Posted

技术标签:

【中文标题】将向量模拟为二维数组【英文标题】:simulate vectors as 2D arrays 【发布时间】:2013-07-13 07:08:24 【问题描述】:

我知道我们不能有多维向量。但我考虑过将向量的单元格定义为指针,这样可以模拟一个二维向量。代码如下:

const char* filename = "D:\\desktop\\IP_ABAD\\images\\1.png";  
GDALDataset  *poDataset = NULL ;  
GDALAllRegister();

poDataset = (GDALDataset *) GDALOpen( filename, GA_ReadOnly );
const int RasterXSize = poDataset -> GetRasterXSize();
const int RasterYSize = poDataset -> GetRasterYSize();
const int RasterCount = poDataset -> GetRasterCount();
CPLErr error = CE_None;
GDALRasterBand *poRasterBand; 
poRasterBand = poDataset -> GetRasterBand(1);
GDALDataType eType;
eType = poRasterBand -> GetRasterDataType();
int nbpp = GDALGetDataTypeSize(eType) / 8;
vector<unsigned char> data(RasterXSize * RasterYSize * RasterCount * nbpp);
error = poDataset -> RasterIO(GF_Read,0,0,RasterXSize,RasterYSize,&data[0],RasterXSize,RasterYSize,eType,RasterCount,0,0,0,0);
vector<unsigned char*>SeperateBitsBands(RasterCount * nbpp);
int sizeOfData = (int)data.size();
int sizeOfSeperateBitsBands = (int)SeperateBitsBands.size();
for (int i = 0 ; i < sizeOfSeperateBitsBands ; i++)

   for ( int j = 0 ; j < sizeOfData ; j++ )
   
       if (j%sizeOfSeperateBitsBands == i)
       
           SeperateBitsBands[i]-> pushback(data.at(j));
       
   
  

但是在SeperateBitsBands[i]-&gt; pushback(data.at(j)); 行中我得到了错误:

IntelliSense: expression must have pointer-to-class type
error C2227: left of '->pushback' must point to class/struct/union/generic type  

在这段代码中,我首先打开了一张图片,并通过“GDAL 库”中的RasterIO 函数提取了它的数字。当然,RasterIO 会按顺序读取图像,因此我尝试借助两个嵌套的 for 循环来分离图像的各个部分。 例如,假设图像是位深度为 16 且大小为 300x400 的 RGB 图像(具有三个波段),则 separatedBitsBands 将是一个大小为 6 的向量,每个单元指向一个大小为 120000 的向量。 昨天我有一个这样的代码:

vector<GDALRasterBand*>Bands(RasterCount);  
for ( i = 0; i<RasterCount; i++)

    Bands.at(i) -> RasterIO(..............)  
  

但是我在Bands.at(i) -&gt; RasterIO(..............)这一行没有出现这样的错误。 谁能告诉我我可以做这样的事情吗?(我的意思是模拟 2D 矢量)。如果是,怎么做??? 以及为什么我在 Bands.at(i) -&gt; RasterIO(..............) 中没有错误???最重要的是,使用多维向量对性能和速度有很大影响吗? 非常感谢。 任何帮助将不胜感激。

【问题讨论】:

您真正需要什么?您可以拥有 2D 向量,但通常最好使用围绕单个向量或数组的包装器,它通过两个索引提供 2D 访问。 @juanchopanza 由于使用高分辨率 .tiff 图像,我实际上需要高性能。你说:single vector or array, which provides 2D access via two indices?我该如何实施?如果您提供一些链接将不胜感激 【参考方案1】:

我知道我们不能有多维向量

可以拥有 2D 向量,例如:

vector< vector<char> > SeperateBitsBands;

请注意:在声明一个vectors的vector时,注意不要将两个>放在一起如下:

vector<vector<char>> SeperateBitsBands;

因为这个 >> 会被编译器误认为是右移运算符。

【讨论】:

谢谢@thomas,我将如何声明向量的大小? @sepideh 查看a good reference,参见“构造函数”部分。 @sepideh:向量没有固定的大小。你可以resize他们或在他们背后推东西。但是,您可以像这样指定它们的 初始 大小:vector&lt;vector&lt;int&gt;&gt; a (10, vector&lt;int&gt;(20)); 它定义了一个 10x20 矩阵(10 个向量,每个向量有 20 个元素。) 所以@yzt如果我想要一个3d向量,声明将是:'vector>>a(10,vector>( 20,vector(30))`对吗?所以出现了 2 个问题 1-我可以像 multidim 数组一样索引这些向量以及如何在它们的末尾推回一个字符吗?2-使用 multidim 向量是否会影响对性能很感兴趣? &gt;&gt; 在 C++11 中非常好。

以上是关于将向量模拟为二维数组的主要内容,如果未能解决你的问题,请参考以下文章

将 NumPy 向量转换为二维数组/矩阵

将字符串向量转换为双二维数组向量

在c ++ Qt中将二维向量/二维数组显示为简单图形

使用 NULL 数组将内存分配给二维数组 (c)

C++ RGB 图像数据叠加成二维数组(向量的向量)

如何将 C# 中的二维数组传递给 C++ DLL?