【问题标题】:Vector will not copy into an array?向量不会复制成数组吗?
【发布时间】:2015-10-13 22:49:36
【问题描述】:

仍在学习 C++。

我正在将一个 CSV 文件导入一个向量,将其更改为一个数组数组,然后创建一个 Mat(一种 openCV 数据类型)用于在 SVM 中进行训练。

我已正确构建向量,但在将向量转换为数组时遇到问题,并且出现此错误: 无法在赋值中将 'std::vector' 转换为 'double'

由于某种原因,第一个复制语句出现此错误,而循环中的复制语句工作正常。

vector< vector<double> > labelsVec;
vector< vector<double> > trainingDataVec;
read_csv(infile1, labelsVec);
read_csv(infile2, trainingDataVec);
double labels[178] = {0.0};
double trainingData[178][5] = {0.0};

copy(labelsVec.begin(), labelsVec.end(), labels);

for (int row = 0; row < trainingDataVec.size(); ++row) {
  copy(trainingDataVec[row].begin(), trainingDataVec[row].end(), trainingData[row]);
}

Mat labelsMat(178, 1, CV_32SC1, labels);
Mat trainDataMat(178, 5, CV_32FC1, trainingData);

【问题讨论】:

  • 您似乎正试图将一个双精度数组插入到一个双精度向量的向量中。
  • 我想你想要vector&lt;double&gt; labelsVec; 因为labels 只有一个维度。

标签: c++ arrays opencv vector


【解决方案1】:

您不需要将vector&lt;double&gt; 复制到double*,除非在非常特殊的情况下。该标准保证向量元素存储在连续的内存中,因此您基本上可以将vector&lt;T&gt; 的第一个元素的地址用作T* 的数组。 C++11 已经通过data() 方法为您提供了这个功能。

我从未使用过 OpenCV,所以我不知道它是否需要整个数据矩阵是连续的,所以我实际上不确定这个解决方案是否适用于您的问题。

这当然不直接适用于二维数据,但您可以轻松地使用解决方法,只为第一个维度填充一个数组,看看this code

#include <iostream>
#include <vector>

using namespace std;

void foo(double** data, size_t i, size_t j)
{
   for (size_t ii = 0; ii < i; ++ii)
     for (size_t jj = 0; jj < j; ++jj)
       cout << data[ii][jj] << endl;
}

int main(void) {
    vector<vector<double>> data = {{0.0f, 1.0f}, {2.0f, 3.0f}};

    const size_t rows = data.size();
    const size_t cols = data[0].size();

    double** arrayData = new double*[rows];

    for (size_t i = 0; i < rows; ++i)
      arrayData[i] = &data[i][0];
    // ^ this obtains the address of first element of i-th row,
    //   where the vector data begins
    //   you can use arrayData[i] = data[i].data() if you have C++11 support

    foo(arrayData, rows, cols);

    delete [] arrayData;

    return 0;
}

我使用动态分配只是因为硬编码大小可能不是一个好主意(取决于优化要求等)。

【讨论】:

    【解决方案2】:

    在声明中

    copy(labelsVec.begin(), labelsVec.end(), labels);

    labelsVec.begin() 返回一个指向vector 类型的指针——因为你的labelsVec 是双精度的vector——而labels 是一个double 类型的数组:这些类型不兼容.我建议完全重新考虑这个实现,因为将向量复制到数组中很奇怪,除非在特定情况下(如上所述),而且解决方案也不那么复杂。

    【讨论】:

    • 这让我觉得做copy(labelsVec[0].begin(), labelsVec[0].end(), labels); 应该可以工作,但我得到的错误是 double free or corruption (out): 0x00000000022000d0
    • 这实际上是由我的程序的另一部分引起的。 (当我尝试将我的 svm 再训练两行时)Ptr&lt;ml::TrainData&gt; tData = ml::TrainData::create(trainDataMat, ml::SampleTypes::ROW_SAMPLE, labelsMat); svm-&gt;trainAuto(tData); 感谢您的帮助!
    【解决方案3】:

    尝试改变

    vector<vector<double>> labelsVec;
    

    vector<double> labelsVec;
    

    您正尝试将 doublesarray 插入 doubles 的向量vector

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-24
      • 2016-07-19
      • 1970-01-01
      • 2022-01-05
      • 2022-01-14
      相关资源
      最近更新 更多