fprintf Octave - повреждение данных

Я пытаюсь записать данные в файлы.txt. Каждый из файлов составляет около 170 МБ (после записи данных в него).

Я использую функцию fprintf в octave с "%.8f" для записи значений с плавающей запятой в файл. Однако я заметил очень странную ошибку, заключающуюся в том, что подмножество записей в некоторых файлах повреждено. Например, одна из строк в файле:

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

что "}" должно было быть "4". Теперь, как fprintf из octave написал "}" с опцией "%.8f"? Что не так?

Другой пример,

0,73289\8B987,...

как это "\8B" попало туда?

Я должен обработать очень большой набор данных с общим количеством точек 360 миллионов. Эта ошибка в подмножестве строк в некоторых файлах становится большой проблемой. Что вызывает эту проблему?

Кроме того, эта коррупция не происходит случайно. Например, если файл имеет 1,1 миллиона строк, где каждая строка соответствует вектору, представляющему экземпляр данных, то возникает проблема, скажем, максимум в 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

открывает новый файл для записи данных в него, когда текущий открытый файл превышает ограничение в 1 миллион точек данных.

Кроме того, обратите внимание, что

   pixVec

переменная не может содержать ничего, кроме значений с плавающей запятой / двойного, иначе октава выдаст ошибку.

0 ответов

Другие вопросы по тегам