二维矢量误差-C++; 我是C++中矢量编程的新手。我想初始化未知大小的2D矩阵,所以我来到向量端。我有两个文件1).h和2).cpp。在.h文件中,我初始化了向量,如下所示 vector<vector<double> > vector_stor; 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'到'void*' 谁能告诉我怎么做?这将对我很有帮助 编辑部分:二维矢量误差-C++; 我是C++中矢量编程的新手。我想初始化未知大小的2D矩阵,所以我来到向量端。我有两个文件1).h和2).cpp。在.h文件中,我初始化了向量,如下所示 vector<vector<double> > vector_stor; Mat_VarReadData(vector_stor); //there are other arguments also but for demo just assume it,c++,vector,C++,Vector,Mat_VarReadData在void*数据中获取参数,我有2D向量。当我这样做的时候,这是一个错误 错误1错误C2664:“Mat_VarReadData”:无法转换参数 从'std::vector'到'void*' 谁能告诉我怎么做?这将对我很有帮助 编辑部分: matvar = Mat_VarReadInfo(mat,"data_struct"); field=Mat_VarGetStructFieldByName(matvar,"vect_stor",0); int
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\u VarReadData
的顺序。函数需要类似于
Mat_VarReadData( ..., vector<vector<double> > mat, ... )
然后,当我调用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];
编辑:如果您想知道为什么&mat[0]
或mat.data()
(第二个需要C++11,感谢您指出)是因为std::vector
保证是连续的,请参阅
正如其他人已经指出的那样,您既不能以
void*
的形式将向量
也不能将向量
直接传递到Mat_VarReadData
,这样做根本没有安全的方法。您所能做的最好的事情是首先将数据检索到一些原始数组中,然后将其相应地转换为您喜欢的容器
我对马蒂奥不熟悉,但我会尽力为你指出正确的方向。我看了一看文档。我必须承认,这不是很有帮助,但无论如何,它表明,只有在检索到有关相应变量的信息后,才能读取任何数据。这可以使用函数来完成。此函数返回一个,它本质上是变量的描述符。在我看来,matvar\u t
包含动态分配数据所需的所有信息,即通过使用new[]。更准确地说,应该精确地保存存储给定变量的数据所需的字节数。
我认为这或多或少是你需要做的:
警告,未测试
matvar_t* varInfo = Mat_VarReadInfo(matFileDescriptor, varName)
char* data = new char[varInfo->data_size];
Mat_VarReadData(matFileDescriptor, varInfo, (void*)(data), start, stride, edge);
我将留给你们去弄清楚起跑、跨步和边缘实际上代表什么
将数据读入数组data
后,必须将其转换为适当的算术类型,可能是double
,但我不能确定。只有这样,您才能将它们拟合到向量中。不幸的是,在这方面我帮不了你,因为它太深入人心了
我知道你在努力学习c/c++和MatIO的基础知识。对于刚开始使用c/c++进行编码的人来说,这不是一个简单的库,因此我强烈建议您在尝试项目进展之前,首先仔细阅读MatIO上提供的任何文档。阅读一些c/c++的基础知识也会很有帮助。首先,您需要将其更改为vector\u stor.resize(size\u X)代码>用于(int i=0;i@Cramer..i在你发帖之前意识到并编辑了它…谢谢你,先生。@Cramer…你能告诉我怎么做吗?…对不起,我的知识有限…你编写了Mat_VarReadData()方法,或者你只是调用它?实际上,我可能:vector\u store.resize(size\u X,std::vector(size\u Y))
,但我不确定Matlab期望的是什么样的向量。先生..谢谢你的回答,实际上我知道这些函数的基本知识..我的问题是如何使向量
与void*data
兼容?…有没有办法?谢谢,Mat_VarReadData是一个内置函数,修改也是一种方式困难…@Cramer他只是调用Mat_VarReadData(void*)。@SaadSaadi如果你调用,一个向量的向量不会有帮助。你需要提供一个连续的双精度块,并适当配置其余的参数。你不能。大多数人(包括MATLAB)的方式处理多维数组是使用单个维度然后将其拆分。假设你有一个NxM矩阵,你可以制作一个数组double mat[N*M]
,然后用mat[i*N+j]
或mat[i+j*M]
对其进行索引,这取决于它是主列(第一个)还是主行(第二个)@brunocodutra…感谢您的解释…关于matIO,我已经开发了整个程序,但现在我希望通过不固定存储它的数组大小来方便用户,这就是为什么我计划使用vector…我的.mat文件inlcude 1 struct,它反过来包含14个不同类型和大小的变量…通过matlab中的数据大小我做了,但现在我想不使用matlab…现在正在寻找未知大小的数据…)
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];
mat[i + j*size_X];
matvar_t* varInfo = Mat_VarReadInfo(matFileDescriptor, varName)
char* data = new char[varInfo->data_size];
Mat_VarReadData(matFileDescriptor, varInfo, (void*)(data), start, stride, edge);