fprintf Octave - 数据损坏

时间:2016-02-28 15:22:59

标签: matlab printf octave data-corruption

我正在尝试将数据写入.txt文件。每个文件大约170MB(在向其写入数据之后)。

我正在使用octave的fprintf功能,使用'%。8f'将浮点值写入文件。但是,我注意到一个非常奇怪的错误,因为某些文件中的条目子集正在被破坏。例如,文件中的一行是:

0.43529412,0} 4313725,0.43137255,0.33233533,...

那"}"应该是" 4"。现在octave的fprintf如何写出"}"与'%。8f'选项首先?出了什么问题?

另一个例子是,

0.73289 \ 8B987,...

那怎么做" \ 8B"到那儿?

我必须处理一个总数为3.6百万点的非常大的数据集。某些文件中的行子集中的此错误正成为一个大问题。是什么导致了这个问题?

此外,这种腐败并不是随机发生的。例如,如果一个文件有110万行,其中每一行对应一个表示数据实例的向量,那么问题就出现在最多100行,并且这100行是聚类的。例如,这些是从行8000到8150分布的,但不是100个已损坏的行中的前一行,前50个位于第10000行附近而其余位于第20000行。它们总是形成一个集群。

注意:下面的代码是代码块,负责提取数据并将其写入文件。代码中的一些变量(如K_Cell)已经计算得更早,在数据写入过程中几乎没有任何作用。

mf = fspecial('gaussian',[5 5], 2);
fidM = fopen('14_01_2016_Go_AeossRight_ClustersM_wLAMRD.txt','w');
fidC = fopen('14_01_2016_Go_AeossRight_ClustersC_wLAMRD.txt','w');
fidW = fopen('14_01_2016_Go_AeossRight_ClustersW_wLAMRD.txt','w');
kIdx = 1;
featMat = [];

% - Generate file names to print the data to
featNo = 0;
fileNo = 1;
filePath = 'wLRD10_Data_Road/featMat_';
fileName = [filePath num2str(fileNo) '.txt'];
fidFeat = fopen(fileName, 'w');

% - Compute the global means and standard deviations
gMean = zeros(1,13);        % - Global mean
gStds = zeros(1,13);        % - Global variance
gNpts = 0;                  % - Total number of data points
fidStat = fopen('wLRD10_Data_Road/featStat.txt','w');

for i=1600:10:10000
    if (featNo > 1000000)
        % - If more than 1m points, close the file and open new one
        fclose(fidFeat);

        % - Get the new file name
        fileNo = fileNo + 1;
        fileName = [filePath num2str(fileNo) '.txt'];
        fidFeat = fopen(fileName, 'w');
        featNo = 0;
    end

    imgName = [fAddr num2str(i-1) '.jpg'];
    img = imread(imgName);

    Ir = im2double(img(:,:,1));
    Ig = im2double(img(:,:,2));
    Ib = im2double(img(:,:,3));
    imgR = filter2(mf, Ir);
    imgG = filter2(mf, Ig);
    imgB = filter2(mf, Ib);

    I = im2double(img);
    I(:,:,1) = imgR;
    I(:,:,2) = imgG;
    I(:,:,3) = imgB;

    I = im2uint8(I);

    [Feat1, Feat2] = funcFeatures1(I);
    [Feat3, Feat4] = funcFeatures2(I);
    [Feat5, Feat6, Feat7] = funcFeatures3(I);
    [Feat8, Feat9, Feat10] = funcFeatures4(I);
    ids = K_Cell{kIdx};
    pixVec = zeros(length(ids),13);             % - Get the local image features

    for s = 1:length(ids)                       % - Extract features
        pixVec(s,:) = [Ir(ids(s,1),ids(s,2)) Ig(ids(s,1),ids(s,2)) Ib(ids(s,1),ids(s,2)) Feat1(ids(s,1),ids(s,2)) Feat2(ids(s,1),ids(s,2)) Feat3(ids(s,1),ids(s,2)) Feat4(ids(s,1),ids(s,2)) ... 
                   Feat5(ids(s,1),ids(s,2)) Feat6(ids(s,1),ids(s,2)) Feat7(ids(s,1),ids(s,2)) Feat8(ids(s,1),ids(s,2))/100 Feat9(ids(s,1),ids(s,2))/500 Feat10(ids(s,1),ids(s,2))/200];
    end

    kIdx = kIdx + 1;

    for s=1:length(ids)
        featNo = featNo + 1;
        fprintf(fidFeat,'%d,%.8f,%.8f,%.8f,%.8f,%.8f,%.8f,%.8f,%.8f,%.8f,%.8f,%.8f,%.8f,%.8f\n', featNo, pixVec(s,:));
    end

    % - Compute the mean and variances
    for s = 1:length(ids)
        gNpts = gNpts + 1;
        delta = pixVec(s,:) - gMean;
        gMean = gMean + delta./gNpts;

        gStds = gStds*(gNpts-1)/gNpts + delta.*(pixVec(s,:) - gMean)/gNpts;
    end
end

请注意代码块:

for s=1:length(ids)
    featNo = featNo + 1;
    fprintf(fidFeat,'%d,%.8f,%.8f,%.8f,%.8f,%.8f,%.8f,%.8f,%.8f,%.8f,%.8f,%.8f,%.8f,%.8f\n', featNo, pixVec(s,:));
end

是将数据点写入文件的代码的唯一部分。

早期的代码块,

if (featNo > 1000000)
    % - If more than 1m points, close the file and open new one
    fclose(fidFeat);

    % - Get the new file name
    fileNo = fileNo + 1;
    fileName = [filePath num2str(fileNo) '.txt'];
    fidFeat = fopen(fileName, 'w');
    featNo = 0;
end
当当前打开的文件超过100万个数据点的限制时,

会打开一个用于向其写入数据的新文件。

此外,请注意

   pixVec

变量不能包含浮点数/双精度值以外的任何值,否则八度音将抛出错误。

0 个答案:

没有答案