c – 向文件读取/写入向量的有效方法
概述:经过几天的研究,我一直无法找到一种快速有效的方法来向/从文件写入/读取向量.我看到的大多数答案都涉及将每个单独的元素推入/弹出文件.随着元素数量的增加,这非常耗时.此外,我一直无法找到解决我的具体问题的尝试.所以,请确保您的解决方案适用于我的特定情况(即阅读整个问题).
我的问题:我有一个非常大的数据结构,其中包含有关图像的像素信息.有60,000张图像,每张784像素.每张图片都是手写数字的图像.因此,除了60,000 * 784像素之外,我还需要包含一个标签,以便知道图像所代表的数字.我使用的标签,当在整个项目的范围内查看时是必需的,是10种可能性的向量,表示0,1,2 … 9,其中只有一个包含’1’/’是’而其余的是’0’/’假’.此外,由于整个项目其余部分的线性代数要求,这种数据结构要求将信息存储在犰狳线性代数库中使用的“Col”结构中.因此,我希望在文件中保存/读取的结构被声明为std :: vector< std :: vector< arma :: Col< double>>>. 这是我现在用来保存数据的函数,用于给出上下文: void SaveTrainingData(vector<vector<Col<double>>> trainingData) //format: trainingData[60000][2][784,10] { ofstream ofile("VectorizedTrainingData.dat",ios::binary); for (int i = 0; i < trainingData.size(); i++) for (int j = 0; j < trainingData[i].size(); j++) for (int k = 0; k < trainingData[i][j].size(); k++) ofile.write((char *)&trainingData[i][j][k],sizeof(double)); } 如果您有任何疑问,请随时提出!提前致谢. 解决方法
我不得不查看这个Armadillo库的文档,但看起来像Col是一个连续的,密集的矢量类.我们可以依赖于连续表示来消除嵌套循环,如下所示:
// format: trainingData[60000][2][784,10] void SaveTrainingData(const vector<vector<Col<double>>>& trainingData) { ofstream ofile("VectorizedTrainingData.dat",ios::binary); const int numImages = trainingData.size(); for (int i = 0; i < numImages; i++) { const vector<Col<double>>& img = trainingData[i]; const int numCols = img.size(); for (int j = 0; j < numCols; j++) { const Col<double>& col = img[j]; ofile.write((char*)&col[0],col.size()*sizeof(double)); } } } 调用从列中的一个元素写入整列的频率降低可能已经有所帮助. 可能值得对此进行测量,以确保实际上更多的I / O绑定而不是内存限制.对于所有这些列矢量向量的潜在内存碎片,这有点棘手. 例如,如果内部向量的大小始终相同(例如,每个图像的大小为784像素),您可能可以使用连续向量< Col>或者这样获得更好的结果: struct Image { Col pixels[768]; }; ... vector<Image> trainingData; … 或类似的东西. .我无法理解线性代数如何与图像代表联系,但希望这给出了一个想法. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |