Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+中写入4D向量时出现问题+;(没有可行的重载';=';)_C++_Vector - Fatal编程技术网

C++ 在C+中写入4D向量时出现问题+;(没有可行的重载';=';)

C++ 在C+中写入4D向量时出现问题+;(没有可行的重载';=';),c++,vector,C++,Vector,我面临的问题是,通过openCV库,我正在阅读一系列图像,它们是自己的“Mat”格式:图像矩阵。 基本上,我需要将大于0的任何像素值作为“真”写入4D向量,将==0的任何像素值作为“假” 为什么是4维? vectorpointVector 3个矢量级别指的是X、Y、Z轴。布尔只是真/假。图像是Y乘Z的,并沿X轴以三维方式堆叠。 基本上,我们有一系列的图像来表示三维叠加的点。 (解释得不好?可能吧) 不管怎样,我的功能是读取一张照片中的点,然后将它们写入4D向量 注意:xVal是一个全局存储地址照

我面临的问题是,通过openCV库,我正在阅读一系列图像,它们是自己的“Mat”格式:图像矩阵。 基本上,我需要将大于0的任何像素值作为“真”写入4D向量,将==0的任何像素值作为“假”

为什么是4维?
vectorpointVector
3个矢量级别指的是X、Y、Z轴。布尔只是真/假。图像是Y乘Z的,并沿X轴以三维方式堆叠。
基本上,我们有一系列的图像来表示三维叠加的点。
(解释得不好?可能吧)
不管怎样,我的功能是读取一张照片中的点,然后将它们写入4D向量

注意:xVal是一个全局存储地址照片的ID号。它用于X维(图像层)


知道怎么回事吗?我浏览过网络,试图挖掘信息(是的,又是深层次的noob)让我头疼不已,因此任何建议都将受到欢迎。

您只访问第一个向量(外部向量),而没有实际访问其中的任何向量

语法应该是
pointVector[x][y][z]=true
,其中
x
y
z
是要用于访问三个嵌套向量的值

你想要的是:

pointVector[xVal][x][y] = true
您使用的是一种访问3D阵列的方法,该阵列在内存中以1D阵列的形式排列,但在您的案例中,它不是您想要的

确保你没有越界 确保您正在访问的元素确实存在!如果显示的代码是实际代码,
pointVector
在尝试使用时将没有元素

要解决这个问题,您必须调整所有向量(外部和内部)的大小。这可能会很麻烦,您可能希望使用1D方法,即分配一个大的一维
bool
数组,并使用您使用的方法访问它(
largeArray[xVal*image.cols*image.rows+x*image.cols+y]

一维方法 在以下代码中,
numberOfValues
是您将访问的最大元素数

int lineTo3DVector (Mat image)
{
      // Takes in matrix and converts to 4D vector.
      // This will be exported and all vectors added together into a point cloud

      std::vector<bool> pointVector;
      pointVector.resize(numberOfValues); 

      for (int x=0; x < image.rows; x++)
      {
           for (int y = 0; y < image.cols; y++)
           {
                if(image.at<int>(x,y) > 0)
                {
                     pointVector[xVal*image.cols*image.rows + x*image.cols + y] = true;
                }
           }
      }

      // Return whatever.
}
int-lineTo3DVector(Mat图像)
{
//接收矩阵并转换为4D矢量。
//这将被导出,并将所有矢量添加到一个点云中
std::向量点向量;
pointVector.resize(numberOfValues);
对于(int x=0;x0)
{
点向量[xVal*image.cols*image.rows+x*image.cols+y]=true;
}
}
}
//归还任何东西。
}

我想你要问的是为什么编译器告诉你它不能将
bool
转换成
向量。这是因为您试图将
bool
分配给
pointVector[某些索引]
,根据
pointVector
的定义,它将是
vector
。考虑用“<代码>向量点向量< /代码>替换定义,并对其进行索引,或者将其索引为代码> PooTovector [X] [Y] [Z] 。另外,您声明的是三维的,而不是四维的。当然,您需要调整所有向量的大小以更正它们的地址。现在有些人可能会说我是个暴躁的人,但我发现这些多向量结构绝对可怕。对于这类事情,我更愿意在任何时候使用Boost多维数组库,而不是std。谢谢Aroosi先生,我将不得不多读几遍,以确保我完全理解它。我假设它是4D,因为每个向量都是一个维度,布尔值在技术上是一个维度,不是吗?@RustyX std::vector通常专门使用每个bool 1位,至少在大多数实现中是这样的。有些吹毛求疵:“你只访问第一个向量(外部向量),而没有实际访问内部的任何向量。”事实上,
pointVector[index]
确实访问了
vector
,这是
pointVector
的一个元素,而
pointVector
是我所说的“外部的”@tobi303这可能是我这方面的一个错误选择(对不起,不是英语母语)。我所说的“访问向量X”是指“访问X以从中获取元素”。如果我知道更好的词,我会写我自己的答案:P。我有时发现将其写成
pointVector->operator[](index)很有帮助
因为这样就更清楚调用了什么方法以及返回类型:
pointVector->operator[]
必须返回向量。没关系,没有什么值得一票否决的;)问题,尽管。。。我认为方括号[]中的地址是我们写信的地址,包括所有级别。为什么需要3组方括号呢?我认为{X包含{Y包含{Z包含bool}}}地址都放在同一个括号中。如果这有意义的话,我最好画一张我的意思的图表。@acrimoniusmirth你有一个向量,它包含一个向量,它包含另一个向量。要访问向量的元素,可以使用语法vector[index]。因为外向量的元素是向量,所以点向量[index]是向量,所以可以将其与点向量[index][anotherIndex]一起索引。等等它不是地址,而是索引。向量是连续数组。
pointVector[xVal][x][y] = true
int lineTo3DVector (Mat image)
{
      // Takes in matrix and converts to 4D vector.
      // This will be exported and all vectors added together into a point cloud

      std::vector<bool> pointVector;
      pointVector.resize(numberOfValues); 

      for (int x=0; x < image.rows; x++)
      {
           for (int y = 0; y < image.cols; y++)
           {
                if(image.at<int>(x,y) > 0)
                {
                     pointVector[xVal*image.cols*image.rows + x*image.cols + y] = true;
                }
           }
      }

      // Return whatever.
}