Код для чтения .dat файла дает ошибку индексации - PullRequest
0 голосов
/ 22 сентября 2018

У меня есть исходный код, который должен читать файл .dat.код находится в Matlab.Каждый раз, когда я пытаюсь прочитать файл .dat, я получаю сообщение об ошибке:

Это файл .dat: https://drive.google.com/file/d/1iQM4P__FQqLCvHHdvkLwbo-jhHNNRXAl/view

Ошибка при использовании нулей

Размер входных данных должен быть целыми числами.

Ошибка в readBasebandFile (строка 49)

hdrMat = нули (numFrames, NumHdrs);

function [ hdrMat, FrameMat ] = readBasebandFile( file )
%UNTITLED Summary of this function goes here
%   Detailed explanation goes here

NumHdrs = 6;

fid = fopen(file, 'rb');
if fid < 3
disp(['couldnt read file ' file]);
return
end

f = dir(file);
fsize = f.bytes;

% read first frame
ctr = 0;
hdrMat = [];
FrameMat = [];

while (1)
if feof(fid)
    break
end

% read header
%frame counter
frameCtr = fread(fid, 1,'uint32');
numBins = fread(fid, 1,'uint32');
binLength = fread(fid, 1,'single');
% sampling frequency which defines the range resolution through
% binLength = C/Fs/2, where C is the speed of light in the medium. 
Fs = fread(fid, 1,'single');
% carrier frequency
Fc = fread(fid, 1,'single');
RangeOffset = fread(fid, 1, 'single');

% check valid header read
if isempty(frameCtr) || isempty(numBins) || isempty(binLength) || isempty(Fs) ... 
        || isempty(Fc) || isempty(RangeOffset)
    break;
end

% read data
data = fread(fid, 2*numBins, 'single');
if ctr==0
    % 2 because it's complex values and 4 because 'single' is 4 bytes. 
   numFrames = fsize / (4*(NumHdrs + 2*numBins)); 
   hdrMat = zeros(numFrames, NumHdrs);
   FrameMat = zeros(2*numBins, numFrames);
end
ctr = ctr + 1;

hdrMat(ctr,:) = [double(frameCtr) double(numBins) binLength Fs Fc 
RangeOffset];
FrameMat(:,ctr) = data;

end

[n,m] = size(hdrMat);
disp([file ' read. NumFrames=' num2str(n)]);
fclose(fid);

1 Ответ

0 голосов
/ 22 сентября 2018

Измените

numFrames = fsize / (4*(NumHdrs + 2*numBins));

с

numFrames = round(fsize / (4*(NumHdrs + 2*numBins)));

В качестве альтернативы используйте ceil или floor вместо round в зависимости от того, что вам нужно.

Каксообщение об ошибке указывает, что когда вы инициализируете массив, ваш размер входных данных должен быть целым числом.Например, у вас может быть матрица 2x2, но нет такой вещи как матрица 2.1x2.3.Математически нелогично.

...