2D 矢量误差C++

2D Vector Error-C++

本文关键字:C++ 误差 2D      更新时间:2023-10-16

我是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<_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是我寻求帮助的变量。

谢谢

检查输入到Mat_VarReadData的顺序。该函数需要类似

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

你需要排列你的输入,以便vector_stor与该输入对齐。

如果我有功能:

foo(int a, double b);

然后当我调用foo时,第一个参数需要是一个int,第二个参数是一个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 元素是否保证是连续的?

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

我对MatIO并不熟悉,但我会尝试为您指出正确的方向。我看了一下Mat_VarReadData的文档。我必须承认不是很有帮助,但无论如何,它指出只有在您检索到有关相应变量的信息后才能读取任何数据。这可以使用函数来完成 Mat_VarReadInfo .这个函数返回一个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);

我会让你弄清楚起点步幅边缘实际上代表什么。

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

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