我是C ++中矢量编程的新手。我想初始化未知大小的2D矩阵,所以我来到矢量方面。我有两个文件1).h和2).cpp。在.h文件中我初始化了这样的矢量
vector<vector<double> > vector_stor;
然后在.cpp中从另一个源获取每个维度的大小后,我重新调整了这个向量的大小
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向量。当我这样做时给出错误
错误1错误C2664:'Mat_VarReadData':无法转换参数 来自'std :: vector&lt; _Ty&gt;' ''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是我寻求帮助的变量。
由于
答案 0 :(得分:1)
检查输入到Mat_VarReadData
的顺序。该功能需要像
Mat_VarReadData( ..., vector<vector<double> > mat, ... )
并且您需要对输入进行排列,以便vector_stor
与输入对齐。
如果我有这个功能:
foo(int a, double b);
然后当我致电foo
时,第一个参数需要是int
,第二个参数需要double
。同样,您需要将输入类型与实际尝试传递的类型相匹配。
看起来该函数将数据转储到单维数组中,而不是矢量向量。试试这个:
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在内存中使用的列主要形式。如果它使用行主要,则需要使用
进行索引mat[i + j*size_X];
编辑:如果您对&mat[0]
或mat.data()
(第二个需要C ++ 11,感谢指出它)感到好奇,那么作品是因为std::vector
得到了保证要连续,请看
Are std::vector elements guaranteed to be contiguous?
答案 1 :(得分:0)
正如其他人已经指出的那样,您无法以vector <vector<double> >
的形式将vector<double>
和Mat_VarReadData
直接传递给void*
,根本就没有安全的方式来做到这一点。您可以做的最好的事情是首先将数据检索到一些原始数组中,然后将其转换为您喜欢的容器。
我对MatIO并不熟悉,但我会尽力指出正确的方向。我看了Mat_VarReadData
的文档。我必须承认,这不是很有帮助,但无论如何它都说明只有在检索到相应变量的信息后才能读取任何数据。这可以使用函数Mat_VarReadInfo
来完成。此函数返回matvar_t
,其中essentialy是变量的描述符。在我看来,matvar_t
包含动态分配数据所需的所有信息,即通过使用 new [] 。更准确地说,matvar_t::data_size
应该确切地保存存储给定变量数据所需的字节数。
我认为这或多或少都是你需要做的事情:
警告,未经过测试
matvar_t* varInfo = Mat_VarReadInfo(matFileDescriptor, varName)
char* data = new char[varInfo->data_size];
Mat_VarReadData(matFileDescriptor, varInfo, (void*)(data), start, stride, edge);
我会留给你弄清楚开始, stride 和 edge 实际上代表什么。
将数据读入数组data
后,您必须将其转换为适当的算术类型,可能是double
,但我无法确定。只有这样你才能将它们装入vector<double>
。在这一部分,我很遗憾无法帮助你,因为它太深入了MatIO。
我知道你正在努力学习基础知识c / c ++和MatIO。那个刚开始用c / c ++编写代码的人不会使用简单的库,所以我强烈建议你先仔细阅读MatIO上可用的任何文档,然后再尝试项目的任何进展。关于基础c / c ++的一些阅读也会非常有用。