我是 C++ vector 编程的新手。我想初始化未知大小的二维矩阵,所以我来到了 vector 端。我有两个文件 1) .h 和 2).cpp。在 .h 文件中,我像这样初始化了 vector
vector<vector<double> > vector_stor;
然后在 .cpp 中从另一个来源获取每个维度的大小后,我像这样重新调整 vector 的大小
size_X=5; //assumption
size_Y=5; //assumption
vector_stor.resize(size_X);
for(int i=0;i<size_X;i++)
vector_stor[i].resize(size_Y);
现在我想存储来自 .mat 文件的数据,最初由 matIO 库读取,使用像这样的 Mat_VarRead 函数
Mat_VarReadData(vector_stor); //there are other arguments also but for demo just assume it
Mat_VarReadData 在 void* 数据中进行争论,我有 2D vector 。当我这样做时它给出错误
Error 1 error C2664: 'Mat_VarReadData' : cannot convert parameter from 'std::vector<_Ty>' to 'void *'
谁能指导我如何做到这一点?这对我很有帮助。
编辑部分:
matvar = Mat_VarReadInfo(mat,"data_struct");
field=Mat_VarGetStructFieldByName(matvar,"vect_stor",0);
int start[2]={0,0};
int stride[2]={1,1};
int edge[2];
edge[0]=field->dims[0];
edge[1]=field->dims[1];
Mat_VarReadData(mat,field,vector_stor,start,stride,edge);
其中 vector_stor 是我正在寻求帮助的变量。
谢谢
最佳答案
检查您对 Mat_VarReadData
的输入顺序。该函数需要类似于
Mat_VarReadData( ..., vector<vector<double> > mat, ... )
并且您需要排列您的输入,以便 vector_stor
与该输入排列。
如果我有这个功能:
foo(int a, double b);
然后当我调用 foo
时,第一个参数需要是 int
,第二个参数是 double
。同样,您需要将您的输入类型与您实际尝试传递的内容相匹配。
看起来该函数会将数据转储到一维数组中,而不是 vector 的 vector 中。试试这个:
std::vector<double> mat;
mat.resize(size_X*size_Y);
// call Mat_VarReadData with &mat[0] as your void*
// now you can index with
mat[i*size_Y + j];
假设矩阵是 MATLAB 从内存中使用的列主要形式。如果它使用 row major,则需要使用
进行索引mat[i + j*size_X];
编辑:如果您对为什么 &mat[0]
或 mat.data()
感到好奇(第二个需要 C++11,谢谢指出out) 有效是因为 std::vector
保证是连续的,见
Are std::vector elements guaranteed to be contiguous?
关于c++ - 二维 vector 错误-C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18649262/