仍在学习C ++上的绳索。
我正在将CSV文件导入向量< vector>,将其更改为数组数组,然后创建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);
答案 0 :(得分:1)
除非在非常具体的情况下,否则您无需将vector<double>
复制到double*
。该标准保证向量元素存储在连续的内存中,因此您基本上可以将vector<T>
的第一个元素的地址用作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;
}
我之所以使用动态分配只是因为对大小进行硬编码可能或者可能不是一个好主意(取决于优化要求等)。
答案 1 :(得分:1)
声明
copy(labelsVec.begin(), labelsVec.end(), labels);
labelsVec.begin()
返回指向vector
类型的指针 - 因为您的labelsVec
是vector
双打 - 而labels
是一个数组键入double
:这些类型不兼容。我建议完全重新考虑这个实现,因为除了特定的实例(如上所述)之外,将向量复制到数组是很奇怪的,并且有更少的复杂解决方案。
答案 2 :(得分:0)
尝试更改
vector<vector<double>> labelsVec;
到
vector<double> labelsVec;
您正在尝试将双打的数组插入向量向量的向量。< / p>