将数据集文件(十六进制值)读取到内存块 - 第2部分

时间:2014-01-23 07:48:25

标签: c++ ifstream

我有一段代码试图将数据从数据集读取到随机分配的内存块。我不知道数据集内部究竟是什么,但是它们访问矩阵值(十六进制值)并放到内存位置。它完美无缺!

const unsigned int img_size = numel_img * sizeof(float);// (1248*960)4bytes= 4.79MB   
for (unsigned int i=0; i<p_rctheader->glb_numImg; ++i)// 0 to 496(Total no of images)
{
    const unsigned int cur_proj = i; // absolute projection number

    // read proj mx
    double* const pProjMx = pProjMatrixBuffers + cur_proj * 12;
    ifsData.read((char*) (pProjMx), 12 * sizeof(double));
    ifsData.seekg(img_size, ios::cur); 
        }

其中pProjMatrixBuffers是

double** pProjMatrixBuffers = new double* [rctheader.glb_numImg];   //
pProjMatrixBuffers[0] = new double[rctheader.glb_numImg * 12];  //
for (unsigned int i=1; i<rctheader.glb_numImg; ++i) {
    pProjMatrixBuffers[i] = pProjMatrixBuffers[0] + i * 12;
}

此后还有另一个读取操作:

rctgdata.adv_pProjBuffers = new float* [num_proj_buffers];// 124 buffers
rctgdata.adv_pProjBuffers[0] = new float[num_proj_buffers * numel_img];// (1.198MB per image*124)*4bytes
    // set it to zero
memset(rctgdata.adv_pProjBuffers[0], 0, num_proj_buffers * numel_img * sizeof(float));
for (unsigned int i=1; i<num_proj_buffers; ++i) {
rctgdata.adv_pProjBuffers[i] = rctgdata.adv_pProjBuffers[0] + i * numel_img;
}

for (unsigned int i=0; i<numProjsInIteration; ++i)// (0 to 124)
{
const unsigned int cur_proj = numProcessedProjs + i; // absolute projection number// 0+124->124+124->248+124->372+124

// read proj mx
ifsData.read((char*) (pProjMatrixBuffers[cur_proj]), 12 * sizeof(double));
 // read image data
ifsData.read((char*) (rctgdata.adv_pProjBuffers[i]), numel_img * sizeof(float));
}

** * ** * EDITS * ** * ** * ** * ** * < / EM> ** * ** * ** * ** * ** * < / EM> 基本上这段代码从数据集读取投影矩阵,该数据集为12个双精度,后跟1248 * 960个图像像素。(浮点数)。这在循环中持续124次。 Q1。如果您在上面的代码中看到,pProjMatrixBuffers [cur_proj]被读取两次,这可能已经完成了一次。 (如果我错了,请纠正我)。 Q2。如何rctgdata.adv_pProjBuffers [i]知道从哪里开始访问数据集中的数据?我的意思是数据集中的位置。如果我困惑你,我很抱歉。如果需要,请向我询问更多信息。非常感谢你提前帮助!!

2 个答案:

答案 0 :(得分:0)

要回答Q2,您可以使用new double[header.numImg * 12]分配一个大的内存块,并且还可以使用new double* [header.numImg]分配一堆行指针。第一行指针[0]指向内存的开头(因为它在new调用中使用)。 for循环然后将每个行指针[i]设置为以12项增量指向大块(因此每行应该有12个项目)。例如,[1]指向大区块中的第12项,[2]指向第24项,等等。

我还没弄清楚Q1的意思。

答案 1 :(得分:0)

使用new无法分配二维MxN阵列。此代码中的解决方法包括分配M指针的1维数组和MxN元素的另一个数组分配。然后将M指针设置为指向数组中每行的M个第一个元素。

这里我们有两个二维数组,我称之为(显而易见的原因)D和F.目前还不清楚D有多大 - rctheader.glb_numImg的价值是多少?

第一个循环将12个双精度数读入一行D并跳过一行F的浮点数据,进行具有适当正偏移的搜索,以加到当前位置(即前进)。这是rctheader.glb_numImg次。

我在这段代码中没有看到一些东西:一个搜索回到文件的开头,在第一个循环之后和第二个循环之前。

第二个循环读取(再次)124行中的每一行12个双打,然后,一下子,每行1248 * 960个浮点数。由于第二张图像的数据紧跟第一张图像的数据,因此无需在这些读取后重新定位,依此类推。 (令人恼火的是,num_proj_buffers和numProjsInIteration应具有相同的值,即124.)

看起来好像第二个读取循环会重新读取第一个循环读取的内容。但由于我不确定p_rctheader-&gt; glb_numImg也是124,我无法确认。

计算第二个循环的123次迭代所读取的内容的大小

(1248*960*4 + 12*8)*124

这将占约0.5 GB - 但文件大小报告为~2.5 GB。

另请注意,第二个循环中的一个索引计算为

unsigned int cur_proj = numProcessedProjs + i;

但numProcessedProjs的初始设置不清楚。