2015-11-13 3 views
4

У меня есть файл «.mat», предположительно содержащий матрицу [30720000x4 double] (значения от акселерометров). Когда я пытаюсь открыть этот файл с «данными Импорт» в Matlab я получаю следующее сообщение об ошибке:Не удается открыть файл matlab

Error using load 
Can't read file F:\vibration_exp_2\GR_UB50n\bearing1\GR_UB50n_1_2.mat. 

Error using load 
Unknown text on line number 1 of ASCII file 
F:\vibration_exp_2\GR_UB50n\bearing1\GR_UB50n_1_2.mat 
"MATLAB". 

Error in uiimport/runImportdata (line 456) 
        datastruct = load('-ascii', fileAbsolutePath); 

Error in uiimport/gatherFilePreviewData (line 424) 
     [datastruct, textDelimiter, headerLines]= runImportdata(fileAbsolutePath, 
     type); 

Error in uiimport (line 240) 
[ctorPreviewText, ctorHeaderLines, ctorDelim] = ... 

размера файла является 921MB, который так же, как другие мои файлы, которые открыты. Я также попытался открыть файл с помощью python, но не успел. Какие-либо предложения? Я использую MATLAB R2013b.


Подробнее:

Как файл был создать:

%% acquisition of vibration data 
% input: 
% sample rate in Hz (max. 51200 Hz, should be used as bearing 
% faults are high-frequent) 
% time in seconds, stating the duration of the measurement 
% (e.g. 600 seconds = 10 minutes) 
% filename for the file to be saved 
% 
% examples: 
% data = DAQ(51200, 600, 'NF1_1.mat'); 
% data = DAQ(51200, 600, 'NF1_2.mat'); 
function data = DAQ(samplerate,time,filename) 

s = daq.createSession('ni'); % Creates the DAQ session 
%%% Add the channels as accelerometer channels (meaning IEPE is turned on) 
s.addAnalogInputChannel('cDAQ1Mod1','ai0','Accelerometer'); 
s.addAnalogInputChannel('cDAQ1Mod1','ai1','Accelerometer'); 
s.addAnalogInputChannel('cDAQ1Mod1','ai2','Accelerometer'); 
s.addAnalogInputChannel('cDAQ1Mod1','ai3','Accelerometer'); 
%s.addAnalogInputChannel('cDAQ1Mod2','ai0','Accelerometer'); 

s.Rate = samplerate; 
s.NumberOfScans = samplerate*time; 
%%% Defining the Sensitivities in V/g 
s.Channels(1).Sensitivity = 0.09478; %31965, top outer 
s.Channels(2).Sensitivity = 0.09531; %31966, back outer 
s.Channels(3).Sensitivity = 0.09275; %31964, top inner 
s.Channels(4).Sensitivity = 0.09363; %31963, back inner 

data = s.startForeground(); %Acquiring the data 

save(filename, 'data'); 

Подробнее:

Когда я открываю файл, используя простой текст редактор Я вижу много характеристик ERS, которые не имеют смысла, но и первая строка:

MATLAB 5.0 MAT-FILE, Platform: PCWIN64, Created on: Thu Apr 30 16:29:07 2015


Подробнее: Сам файл: https://www.dropbox.com/s/r7mavil79j47xa2/GR_UB50n_1_2.mat?dl=0 Это 921MB.


EDIT:

Как я могу восстановить мои данные?

Я пробовал this, но получил ошибки памяти. Я также пробовал this, но это не сработало.

+1

'importdata'! =' Load'. Для файлов .mat вы должны использовать 'load' отдельно. По-видимому, 'importdata' использует это под капотом. – Adriaan

+0

Ну, я тоже попробовал загрузить, тогда я получаю простую ошибку, говоря, что он не может открыть файл. (Нет дополнительной информации) – Ojtwist

+0

Откуда этот файл? Это действительно файл '* .mat'? – excaza

ответ

1

Чтобы ответить буквально на вопрос, мое предложение состояло в том, чтобы сначала убедиться, что файл в порядке. Этот инструмент на обмен файлами, очевидно, знает, как диагностировать поврежденные .mat файлов, начиная с версии V5 (R8):

http://www.mathworks.com/matlabcentral/fileexchange/6893-matcat-mat-file-corruption-analysis-tool

+0

Ну, я попробовал инструмент, и он говорит, что файл поврежден. – Ojtwist

+1

@Ojtwist Можете ли вы подтвердить те, которые предоставили файлу, что сохранение данных не было остановлено на диске, из-за дисковой квоты или сбоя питания? –

+0

@Ojtwist Вы должны проверить центральные форумы MATLAB, они охватывают довольно много проблем. Например: http://www.mathworks.com/matlabcentral/answers/98890-how-do-i-recover-data-from-a-corrupt-mat-file –

0

размер файла (индексы выходят из диапазона), как представляется, проблема. Octave, который следует читать .mat файлы, выдает ошибку

memory exhausted or requested size too large for range of Octave's index type 

Чтобы узнать, что это неправильно, то вы, возможно, придется написать тестовую программу вне MatLab, где у вас есть больше контроля над управлением памятью. Примерами являются here, включая инструкции по их созданию на вашей собственной платформе. Эти автономные программы могут не иметь одинаковых проблем с памятью. Программа matdgns.c специально предназначена для проверки ошибок .mat.

+0

Заинтересованы в том, чтобы узнать причину этого. Программа 'matdgns.c' предназначена для диагностики файлов' .MAT', поэтому она актуальна, и попытка «Octave» вместо «Python» открывать файлы '.MAT' (как это делает OP) - логическая идея. –

4

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

Причина, по которой файл .mat-файла не может быть загружен из-за поврежденных данных. Что делает его «невосстановимым» - это способ, которым он хранится внутри страны.Точный формат указан в MAT-File Format Documentation. Поэтому я решил вручную построить простой читатель, чтобы специально прочитать ваш файл .mat.

Имеет смысл, что splitmat.m ничего не может восстановить, поскольку он будет в основном разделять данные на куски, одну сохраненную переменную на кусок, однако в этом случае сохраняется только одна переменная и, следовательно, только один кусок, который оказывается, поврежден.

В этом случае данные хранятся в виде miCOMPRESSED, который является нормальным массивом matlab, сжатым с использованием gzip. (Который, в качестве побочного примечания, не кажется подходящим для «случайных» данных вибрации.) Это может объяснить предыдущие комментарии о меньшем размере файла, чем полные данные, так как размер файла совпадает с полностью сохраненным значением.

Я извлек сжатый архив и попытался распаковать его различными способами. В основном это «.gz» без заголовка, который можно добавить вручную. К несчастью, похоже, что поврежденный блок близок к началу набора данных. Я никоим образом не специалист по gzip, но насколько я знаю, словарь (или ключ дешифрования) хранится динамически, что делает все данные бесполезными с точки зрения повреждения блока. Если вы действительно в восторге, то, кажется, a way to recover data даже за точкой, где данные повреждены, но этот метод массово требует времени. Также единственным способом проверки данных этих разделов является ручная проверка, которая в вашем случае может оказаться очень сложной.

Ниже приведен код, который я использовал для извлечения .gz-файла, поэтому, если вы хотите попробовать, вы можете начать. Если вам удастся расшифровать данные, вы можете прочитать их, как описано в MAT-File Format, 13f.

corrupted_file_id = fopen('corrupt.mat','r'); 
%% some header data 
% can be skipped replacing this block with 
% fread(id,132); 

%header of .mat file 
header_text = char(fread(corrupted_file_id,116,'char')'); 
subsystem_data_offset = fread(corrupted_file_id,8,'uint8'); 
version = fread(corrupted_file_id,1,'int16'); 
endian_indicator = char(fread(corrupted_file_id,2,'int8')'); 
data_type = fread(corrupted_file_id,4,'uint8'); 
%data_type is 15, so it is a compressed matlab array 


%% save te content 
data_size = fread(corrupted_file_id,1,'uint32'); 
gz_file_id = fopen('compressed_array.gz','w'); 
% first write a valid gzip head 
fwrite(gz_file_id,hex2dec('1f8b080000000000'),'uint64',0,'b'); 

% then write the data sequentialy 
step = 1:1e3:data_size;% 1MB steps 
for idx = step 
fwrite(gz_file_id,fread(corrupted_file_id,1e3,'uint8')); 
end 
step = step(end):data_size;% 1B steps 
for idx = step 
    fwrite(gz_file_id,fread(corrupted_file_id,1,'uint8')); 
end 
fclose(gz_file_id); 
fclose(corrupted_file_id); 
Смежные вопросы