0

我是 C++ 向量编程的新手。我想初始化未知大小的二维矩阵,所以我来到了向量端。我有两个文件 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<_Ty>”转换为“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 是我寻求帮助的变量。

谢谢

4

2 回答 2

1

检查输入到Mat_VarReadData. 该功能需要类似于

Mat_VarReadData( ..., vector<vector<double> > mat, ... )

并且您需要排列输入,以便vector_stor与该输入对齐。

如果我有这个功能:

foo(int a, double b);

然后当我调用foo第一个参数需要是 aint和第二个 a double。同样在这里,您需要将输入类型与您实际尝试传递的内容相匹配。

另请查看: http: //libmatio.sourcearchive.com/documentation/1.3.3/group__MAT_g1845000f4fc6252ec5ff11c4b9f0759f.html

看起来该函数会将数据转储到一维数组中,而不是向量的向量中。尝试这个:

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保证是连续的,请参阅 是否保证 std::vector 元素是连续的?

于 2013-09-06T03:18:05.737 回答
0

正如其他人已经指出的那样,您既不能vector <vector<double> >也不能vector<double>直接以Mat_VarReadData的形式传递给void*,根本没有安全的方法可以做到这一点。您可以做的最好的事情是首先将数据检索到一些原始数组中,然后将其相应地转换为您喜欢的容器。

我对 MatIO 不熟悉,但我会尽力为您指明正确的方向。我查看了Mat_VarReadData. 我必须承认这不是很有帮助,但无论如何它表明只有在您检索到有关相应变量的信息后才能读取任何数据。这可以使用函数来完成Mat_VarReadInfo。此函数返回 a matvar_t,它本质上是变量的描述符。在我看来,它包含了动态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);

我会让你弄清楚startstrideedge究竟代表什么。

将数据读入数组data后,您可能必须将其转换为适当的算术类型double,但我不能确定。只有这样,您才能将它们放入vector<double>. 在这部分我很遗憾不能帮助你,因为它对 MatIO 太深入了。

我了解您正在努力学习基础 c/c++ 以及 MatIO。对于刚开始使用 c/c++ 编码的人来说,这不是一个简单的库,因此我强烈建议您在尝试项目的任何进展之前先仔细阅读 MatIO 上可用的任何文档。阅读一些关于 c/c++ 的基础知识也会很有帮助。

于 2013-09-06T04:03:12.553 回答