C++ 如何从磁盘C+读取矩阵的某些元素+;

C++ 如何从磁盘C+读取矩阵的某些元素+;,c++,matrix,io,C++,Matrix,Io,我有一个代码,我从磁盘读取1024x1024浮点矩阵,然后我得到它的一些元素,并对新矩阵进行如下处理 // mask is the 1Kx1K matrix that 1/64 element of it are 1 other elements are 0; // it is a mask for **Mat data** string filename = "filepath"; Mat data(1024,1024,CV_32F); readMatrix(filename, data)

我有一个代码,我从磁盘读取
1024x1024浮点矩阵
,然后我得到它的一些元素,并对新矩阵进行如下处理

// mask is the 1Kx1K matrix that 1/64 element of it are 1 other elements are 0;
// it is a mask for **Mat data** 

string filename = "filepath";
Mat data(1024,1024,CV_32F);
readMatrix(filename, data);

Mat smallMat(128,128,CV_32F);
getSmallerMat(data, mask, smallMat);    
我从磁盘读取浮点数并使用
getSmallerMat(…)
填充smallMat,这是检查
的两个循环,如果掩码(I,j)==1,则写入smallMat中的下一个位置

readMatrix(string fpath,Mat& data){
    FILE* fp = fopen(fpath.c_str(),"rb");
    if (!fp)perror("fopen");
    int size = 1024;
    data.create(size,size,CV_32F);

    float* buffer= new float[size];
    for(int i=0;i<size;++i)   {
        fread(buffer,sizeof(float),size,fp);
        for(int j=0;j<size;++j){
            data.at<float>(i,j)=buffer[j];
        }
    }
    fclose(fp);
    free(buffer);
}
readMatrix(字符串fpath、Mat和data){
FILE*fp=fopen(fpath.c_str(),“rb”);
如果(!fp)perror(“fopen”);
int size=1024;
创建(大小、大小、CV_32F);
浮点*缓冲=新浮点[大小];

对于(int i=0;i我不确定我是否正确理解了这个问题,但您是否正在寻找一种比通过流更快地访问硬盘上数据的方法?要在流中查找特定的矩阵元素(i,j),您需要读取整个文件(在最坏的情况下),即复杂性是线性的,这是无法帮助的。 但是,如果您确实准确地知道场地中的位置(即,如果您使用固定长度格式表示双打等),请参见kg 应该比实际读取所有字符更快,直到达到所需位置

编辑: 鉴于对其他答案的评论中的讨论,我想强调的是,在文件流中使用一些seek是O(N),因此对特定元素的多次seek将比只读取整个文件慢得多。我不知道有什么方法可以访问存储在O(1)中硬盘上的数据但是,如果您所需要的只是掩码外为零的矩阵,那么您应该熟悉稀疏矩阵的概念。
请参阅例如和您库的文档,例如

我不确定我是否正确理解了这个问题,但是您是否正在寻找一种比通过流更快地访问硬盘上数据的方法?要在流中找到某些特定的矩阵元素(I,j),您需要读取整个文件(在最坏的情况下),即复杂性是线性的,这是无法帮助的。 但是,如果您确实准确地知道场地中的位置(即,如果您使用固定长度格式表示双打等),请参见kg 应该比实际读取所有字符更快,直到达到所需位置

编辑: 鉴于对其他答案的评论中的讨论,我想强调的是,在文件流中使用一些seek是O(N),因此对特定元素的多次seek将比只读取整个文件慢得多。我不知道有什么方法可以访问存储在O(1)中硬盘上的数据但是,如果您所需要的只是掩码外为零的矩阵,那么您应该熟悉稀疏矩阵的概念。
请参阅例如和您库的文档,例如

我不确定我是否正确理解了这个问题,但是您是否正在寻找一种比通过流更快地访问硬盘上数据的方法?要在流中找到某些特定的矩阵元素(I,j),您需要读取整个文件(在最坏的情况下),即复杂性是线性的,这是无法帮助的。 但是,如果您确实准确地知道场地中的位置(即,如果您使用固定长度格式表示双打等),请参见kg 应该比实际读取所有字符更快,直到达到所需位置

编辑: 鉴于对其他答案的评论中的讨论,我想强调的是,在文件流中使用一些seek是O(N),因此对特定元素的多次seek将比只读取整个文件慢得多。我不知道有什么方法可以访问存储在O(1)中硬盘上的数据但是,如果您所需要的只是掩码外为零的矩阵,那么您应该熟悉稀疏矩阵的概念。
请参阅例如和您库的文档,例如

我不确定我是否正确理解了这个问题,但是您是否正在寻找一种比通过流更快地访问硬盘上数据的方法?要在流中找到某些特定的矩阵元素(I,j),您需要读取整个文件(在最坏的情况下),即复杂性是线性的,这是无法帮助的。 但是,如果您确实准确地知道场地中的位置(即,如果您使用固定长度格式表示双打等),请参见kg 应该比实际读取所有字符更快,直到达到所需位置

编辑: 鉴于对其他答案的评论中的讨论,我想强调的是,在文件流中使用一些seek是O(N),因此对特定元素的多次seek将比只读取整个文件慢得多。我不知道有什么方法可以访问存储在O(1)中硬盘上的数据但是,如果您所需要的只是掩码外为零的矩阵,那么您应该熟悉稀疏矩阵的概念。
请参阅例如和库的文档,例如从代码中可以看出,矩阵以二进制形式存储为浮动的内存映像。您需要的是直接转到磁盘上的索引,其中(i,j)float是。您可以使用以下公式计算此位置:
index=i*colWidth+j
,其中
colWidth
在您的情况下为1024。您可以使用
fseek
ftell
移动您的位置,并在
fopen
打开的文件中从您的代码中获取您的位置。您的矩阵似乎存储在i中n二进制作为浮动的内存映像。您需要的是直接转到磁盘上的索引,其中(i,j)float是。您可以使用以下公式计算此位置:
index=i*colWidth+j
,其中
colWidth
在您的情况下为1024。您可以使用
fseek
ftell
移动您的位置,并在
fopen
打开的文件中从您的代码中获取您的位置。您的矩阵似乎存储在i中n二进制作为浮点数的内存映像。您需要的是直接转到磁盘上的索引,其中t
float get(int i, int j, int rowsize, FILE * fp) {
    float retVal = -1.0f; //-infinity may be?
    // if you need restoring the stream pos
    long lastPos = ftell(fp);
    // ff to i*row + j
    fseek(fp , ((i * rowsize) + j) * sizeof(float), SEEK_SET);
    fread((unsigned char *)&retVal, sizeof(float), 1, fp);
    // restore prevpos
    // bla bla bla
    return retVal;
}