2D 矢量误差C++
2D Vector Error-C++
我是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 ++阅读也将非常有帮助。
- 为什么在浮点中从大到小会引入更多的误差
- 基于相邻元素 c++ 的分段误差范围的循环
- QImage::p ixel 和 QImage::setPixel 坐标超出范围误差
- 将误差线添加到 VTK 二维散点图
- 动态矩阵特征分解过程中的误差
- 转换为非标量误差是什么意思?我该如何解决?
- 特征误差:INVALID_MATRIX_PRODUCT乘向量和矩阵
- 使用不同参数匹配器的同一方法ON_CALL AND EXPECT_CALL会产生饱和和活动误差
- boost odeint 中的受控误差步进器是否支持复杂的数据类型?
- 此外,在计算大斐波那契数时存在精度误差
- C++17中不定参数函数的误差
- 多态性中独立类的基本误差.C++
- 犰狳函数的不同最小二乘误差
- 在 qt 中的绘图中拖动误差线
- variadic函数和折叠表达:试图在Visual Studio 2017中编译时致命误差
- 在Cython中使用移动方法时的汇编误差
- variadic模板代码中的GCC VS MSVC编译误差
- CMAKE和CUDA的权限误差
- OPENCV C 中的分割故障误差
- ROS中未定义的参考误差到OpenCV图像转换器